Lambda 开发效率提升不止一点点

一、介绍

1、Lambda表达式可以被认为是函数式接口的实例。使用Lambda表达式时,需要确定要使用哪种函数式接口,并根据该函数式接口的参数列表和返回类型定义Lambda表达式。 
 
2、作为方法参数: 
Lambda表达式可以作为方法参数传递,从而简化代码并使代码更易读。 
 
3.、作为返回值: 
Lambda表达式可以作为函数的返回值。这种技术可以用于在运行时根据需要创建函数。 
 
4、作为变量: 
Lambda表达式可以分配给变量,从而使其可以像普通函数一样使用。例如,可以将Lambda表达式存储在变量中,然后将该变量传递给方法,以便在另一个方法中使用Lambda表达式。 
 
5、为集合框架中的元素: 
Lambda表达式可以作为集合框架中的元素。在这种情况下,Lambda表达式通常用于遍历集合中的元素,并执行某些特定的操作。 
 
6、作为流中的元素: 
Lambda表达式可以作为Java 8中的流中的元素。在这种情况下,Lambda表达式用于处理流中的元素,并执行某些特定的操作。 
 
总之,Lambda表达式是Java 8中最重要的新功能之一,它简化了代码并使其更易读。Lambda表达式可以作为函数式接口的实例,方法参数,返回值,变量,集合框架中的元素以及流中的元素。

二、Lambda 表达式核心方法

1、作为函数式接口的实例

interface MyInterface {
    void doSomething(String s);
}

// 使用Lambda表达式创建该接口的实例
MyInterface mi = (s) -> System.out.println(s);

// 调用该实例
mi.doSomething("Hello, World!");

说明:在上面的代码中,我们定义了一个函数式接口MyInterface,并使用Lambda表达式创建了该接口的实例mi。Lambda表达式  (s) -> System.out.println(s)  接受一个类型为String的参数,并将其打印到控制台上。然后我们调用实例mi的doSomething方法,并传入一个字符串参数。

2、作为函数式接口的实例

interface MyInterface {
    void doSomething(String s);
}

// 使用Lambda表达式创建该接口的实例
MyInterface mi = (s) -> System.out.println(s);

// 调用该实例
mi.doSomething("Hello, World!");

说明:在上面的代码中,我们定义了一个函数式接口MyInterface,并使用Lambda表达式创建了该接口的实例mi。Lambda表达式  (s) -> System.out.println(s)  接受一个类型为String的参数,并将其打印到控制台上。然后我们调用实例mi的doSomething方法,并传入一个字符串参数。 

3、作为方法参数

public void invoke(MyInterface mi, String s) {
    mi.doSomething(s);
}

// 调用该函数并传入Lambda表达式作为参数
invoke((s) -> System.out.println("Hello, " + s), "World!");
invoke((s) -> System.out.println("Goodbye, " + s), "Java!");

说明:在上面的代码中,我们定义了一个高阶函数invoke,它接受一个MyInterface类型的参数和一个String类型的参数。然后我们调用该函数两次,分别传入两个Lambda表达式作为参数。第一个Lambda表达式接受一个String类型的参数,并将其打印到控制台上。第二个Lambda表达式也接受一个String类型的参数,并将其打印到控制台上。 

4、作为返回值

public MyInterface create(String message) {
    return (s) -> System.out.println(message + " " + s);
}

// 调用该函数并使用返回的Lambda表达式
MyInterface mi1 = create("Hello,");
MyInterface mi2 = create("Goodbye,");

mi1.doSomething("World!");
mi2.doSomething("Java!");

说明:在上面的代码中,我们定义了一个高阶函数create,它接受一个String类型的参数,并返回一个MyInterface类型的Lambda表达式。我们将该Lambda表达式存储在mi1和mi2变量中,然后输出一个MyInterface函数

三、Lambda表达式的常用函数方法

1、Consumer使用

List<String> list = Arrays.asList("hello", "world");
// 使用 Lambda 表达式遍历 List,并打印其中的元素
list.forEach(str -> System.out.println(str));

说明:Consumer 接口接受一个参数并没有返回值,它表示执行某些操作但不返回任何结果,上面的代码中,我们使用了 Consumer 接口的 forEach 方法来遍历 list,并打印其中的字符串。 

2、Supplier使用

// 使用 Lambda 表达式创建 Supplier
Supplier<String> supplier = () -> "Hello, World!";
// 输出 supplier 返回的值
System.out.println(supplier.get());

说明:Supplier 接口不接受任何参数,但返回一个值,它表示一个函数,用于从某个地方获取一个值。上面的代码中,我们使用 Lambda 表达式创建了一个 Supplier,它返回字符串 "Hello, World!",并使用 get 方法获取该值并打印到控制台上。

3、Function使用

// 使用 Lambda 表达式将一个字符串转换为大写字母
Function<String, String> function = str -> str.toUpperCase();
String result = function.apply("hello, world");
System.out.println(result);

说明:Function 接口接受一个参数并返回一个值,它表示一个函数,用于将某些值转换为其他类型的值。上面的代码中,我们使用 Lambda 表达式创建了一个 Function,将字符串转换为大写字母,并将其应用于字符串 "hello, world",最后输出转换后的结果。 

4、Predicate使用

List<String> list = Arrays.asList("hello", "world");
// 使用 Lambda 表达式过滤出长度大于 5 的字符串
list.stream().filter(str -> str.length() > 5).forEach(System.out::println);

说明:Predicate 接口接受一个参数并返回一个布尔值,它表示一个函数,用于测试某些条件是否成立。上面的代码中,我们使用 Lambda 表达式创建了一个 Predicate,测试字符串长度是否大于 5,然后使用 filter 方法过滤出符合条件的字符串,并使用 forEach 方法遍历并打印这些字符串。

5、BinaryOperator使用

BinaryOperator<Integer> operator = (x, y) -> x + y;
int result = operator.apply(1, 2);
System.out.println(result); // 输出 3

说明:BinaryOperator 接口继承自 BiFunction 接口,接受两个同类型参数并返回一个同类型值,它表示一个函数,用于执行某种操作并返回结果。上面的代码中,我们使用 Lambda 表达式创建了一个 BinaryOperator,它将两个整数相加,并将其应用于 1 和 2,最后输出结果 3。

6、BiConsumer使用

Map<String, Integer> map = new HashMap<>();
// 使用 Lambda 表达式向 Map 中添加元素
BiConsumer<String, Integer> biConsumer = (key, value) -> map.put(key, value);
biConsumer.accept("one", 1);
biConsumer.accept("two", 2);
System.out.println(map); // 输出 {one=1, two=2}

说明:BiConsumer 接口接受两个参数并没有返回值,它表示执行某些操作但不返回任何结果。上面的代码中,我们使用 Lambda 表达式创建了一个 BiConsumer,将键值对添加到 Map 中,并输出 Map 的内容。

7、BiFunction使用

// 使用 Lambda 表达式将两个字符串连接起来
BiFunction<String, String, String> biFunction = (str1, str2) -> str1 + str2;
String result = biFunction.apply("hello, ", "world!");
System.out.println(result); // 输出 "hello, world!"

说明:BiFunction 接口接受两个参数并返回一个值,它表示一个函数,用于将两个值合并为一个值。上面的代码中,我们使用 Lambda 表达式创建了一个 BiFunction,将两个字符串连接起来,并将其应用于 "hello, " 和 "world!",最后输出结果 "hello, world!"。

8、UnaryOperator使用

UnaryOperator<Integer> operator = x -> x + 1;
int result = operator.apply(1);
System.out.println(result); // 输出 2

说明:UnaryOperator 接口继承自 Function 接口,接受一个同类型参数并返回一个同类型值,它表示一个函数,用于执行某种操作并返回结果。上面的代码中,我们使用 Lambda 表达式创建了一个 UnaryOperator,它将输入值加 1,并将其应用于整数 1,最后输出结果 2。

9、BiPredicate使用

BiPredicate<String, Integer> biPredicate = (str, length) -> str.length() > length;
boolean result1 = biPredicate.test("hello", 4);
boolean result2 = biPredicate.test("world", 5);
System.out.println(result1); // 输出 true
System.out.println(result2); // 输出 false

说明:BiPredicate 接口接受两个参数并返回一个布尔值,它表示一个函数,用于测试两个条件是否成立。上面的代码中,我们使用 Lambda 表达式创建了一个 BiPredicate,测试字符串长度是否大于给定长度,然后将其应用于两个字符串和不同的长度,最后输出结果

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>