Lambda 表达式语法
args -> expr
args -> {return expr;}
整个表达式由三个部分组成:
第一部分为一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数;
第二部分为一个箭头符号:->;
第三部分为方法体,可以是表达式和代码块。
代码例子
() -> {System.gc();return 0;};
(Thread t) -> t.start();
(int i , int j) -> return i + j;
当形式参数只有一个时,()不是必须的。相反当参数的个数不为1时,()是一定要的。参数的具体类型也不需要具体指定,如果编译器可以根据程序上下文进行类型推断。 方法体有多个语句时必须用{}包裹。如果只有一个语句,不管是否有返回值,都可以不用{}包裹,一般不推荐用{}包裹。
方法引用和构造器引用
方法引用使用::操作符将方法名和对象或类名分隔,常用以下三种形式:
对象::实例
方法类::静态方法
类::实例方法
在 lambda 表达式中加入Predicate
java.util.function.Predicate 允许将两个或更多的 Predicate 合成一个。它提供类似于逻辑操作符AND和OR的方法,名字叫做 and()、or(),用于将传入 filter() 方法的条件合并起来。例如,要得到所有以J开始,长度为四个字母的语言,可以定义两个独立的 Predicate 示例分别表示每一个条件,然后用 Predicate.and() 方法将它们合并起来,如下所示
// 甚至可以用and()、or()逻辑函数来合并Predicate
// 例如要找到所有以J开始,长度为四个字母的名字,你可以合并两个Predicate并传入Predicate<String> startsWithJ = (n) -> n.startsWith("J");
Predicate<String> fourLetterLong = (n) -> n.length() == 4;
names.stream()
.filter(startsWithJ.and(fourLetterLong))
.forEach((n) -> System.out.print("nName, which starts with 'J' and four letter long is : " + n));
Map和Reduce
Map和Reduce操作是函数式编程的核心操作,因为其功能,reduce 又被称为折叠操作。另外,reduce 并不是一个新的操作,你有可能已经在使用它。SQL中类似 sum()、avg() 或者 count() 的聚集函数,实际上就是 reduce 操作,因为它们接收多个值并返回一个值。
对列表的每个元素应用函数
在 map() 方法里,就可以对集合的各个元素进行转换
List<String> G7 = Arrays.asList("USA", "Japan", "France", "Germany", "Italy", "U.K.","Canada");
String G7Countries = G7.stream().map(x -> x.toUpperCase()).collect(Collectors.joining(", "));System.out.println(G7Countries);
过滤
filter方法
网友评论