前言
为什么要阅读本书
- 如何编写简单、干净、易读的代码,尤其是对于集合的操作
- 如何简单地使用并行计算提高性能
- 如何准确地为问题建模
- 如果写出更简单的并发代码
- 如何测试和调试Lambda表达式
第1章 简介
?什么是函数式编程
- 核心是:在思考问题时,使用不可变值和函数,函数对一个值进行处理,映射成另一个值
第2章 Lambda表达式
第一个Lambda表达式
new Button().addActionListener(e -> {
System.out.println("hello world");
});
重要函数接口
public static void functionInterface() {
/**
* Predicate<T> 入参T,返回boolean
*/
Predicate<Integer> persi = x -> x > 6;
System.out.println(persi.test(10));
/**
* BinaryOperator<T> 入参T,T,返回T
*/
BinaryOperator<Integer> binaryOperator = (x, y) -> x + y;
System.out.println(binaryOperator.apply(10, 2));
/**
* Consumer<T> 入参T,无返回void
*/
Consumer<Integer> consumer = (x) -> System.out.println(x);
consumer.accept(10);
/**
* Function<T,R> 入参T,返回R
*/
Function<Integer, String> function = x -> x + "10";
System.out.println(function.apply(10));
/**
* UnaryOperator<T> 入参T 返回T
*/
UnaryOperator<Integer> unaryOperator = (x) -> x + 10;
System.out.println(unaryOperator.apply(10));
/**
* Supplier<T> 入参None,返回T
*/
Supplier<Integer> supplier = () -> 10;
System.out.println(supplier.get());
}
其他lambad表达式
public static void mapreducer() {
System.out.println(Arrays.asList(1, 2, 3, 4, 5).stream().map(cost -> 5 + cost)
.reduce(10, (sum, cost) -> sum + cost).toString());
System.out
.println(Arrays.asList(1).stream().reduce(10, (sum, cost) -> sum + cost).toString());
}
public static void mapcollect() {
System.out.println(Arrays.asList("this", "is", "a", "chinese", "person").stream()
.map(cost -> cost.toUpperCase()).collect(Collectors.joining(", ")));
System.out.println(Arrays.asList("1", "2", "3", "4", "5", "0").stream()
.map(cost -> 5 + cost).collect(Collectors.counting()));
}
注意事项
- lambda是一个表达式而已,可以称为闭包或者匿名函数
- 当一个类使用了@Functional注释的函数式接口,自带抽象函数方法或者单个抽象方法时才可以使用lambda
- 当不改变lambda当中的变量值的时候才可以使用方法引用;list.forEach(System.out::println);
list.forEach(System.out::println);