java8 引入了函数式接口,其中用最多的当属Consumer、Predicate、Function这三类,这里写个例子展示没有缩写时和缩写时的差异。
废话不多说,直接上代码:
public class FunctionExpress {
public static void main(String[] args) {
ArrayList<String> strings = new ArrayList<>();
Collections.addAll(strings,"Java","Python","C++","JavaScript","C#");
/**
* java.util.function.Consumer<T> 接口定义了一个test抽象方法,接受泛型T,返回一个boolean
* 函数式接口 Predicate =====================start===================================
*/
Stream<String> str01 = strings.stream().filter(new Predicate<String>() {
@Override
public boolean test(String s) {
return s.startsWith("C");
}
});
str01.forEach(System.out::print);
//上面代码等价于下面的代码
Stream<String> str02 = strings.stream().filter(s ->s.startsWith("C"));
str02.forEach(System.out::print);
//函数式接口 Predicate ======================end====================================
/**
* java.util.function.Consumer<T> 接口定义一个accept的抽象方法,接受泛型T的对象,没有返回值void
* 函数式接口 Comsumer ======================start==================================
*/
strings.stream().forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.print(s+"、");
}
});
System.out.println();//此行没有意义,仅仅用于输出控制换行
//上面代码等价于下面的代码
strings.stream().forEach(s -> System.out.print(s+","));
//函数式接口 Comsumer ======================end==================================
/**
* java.util.function.Function<T,R> 接口定义一个apply的抽象方法,接受泛型T的对象,返回一个泛型R的对象
*函数式接口 Function ======================start==================================
*/
Stream<Integer> str03 = strings.stream().map(new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return s.length();
}
});
str03.forEach(a-> System.out.println(a));
//函数式接口 Function ======================end==================================
}
/**
* 补充下:流是java API java8中的新成员,允许你以声明的方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现)
* 集合讲的数元素,流讲的是计算
*/
}