Lambda表达式和Stream流的简单使用
Lambda表达式:
lambda表达式是Java8中提供的一种新特性,它支持java也能进行简单的函数式编程,是直接对于其中的lambda抽象,是一个匿名函数,即没有名称的函数。
以前将某些功能传递给某些方法总要写匿名内部类,不用创建类对象,也是对Java的一种简化。
例如方法实现conparator的比较,创建Comparator接口的匿名内部类对象,在匿名内部类中重写comparator方法,实现比较。
al.sort(new Comparator<String>() {//传进来的是接口,要莫是实现类,要莫是接口,
@Override
public int compare(String o1, String o2) {
return 0;
}
});
lambda表达式是对匿名内部类的一种简化,直接将接口中方法的实现作为参数进行传递,括号里面写要传递的参数,因此又被称为函数表达式。(a,b)->{return 0;}; 匿名函数,可以将匿名函数代码块作为参数进行传递,语法就更加简单,body体中只有一行代码时,可以不要{}。而且被实现的接口中只能又一个抽象方法,Lambda表达式的返回类型不是接口中方法的返回类型,而是接口类型。
al.sort((a, b) -> {
return 0;
});
/* lambdeDeom ld = ((a,b)->{
System.out.println("hello"); 类的实现在此重写,包装
});*/
lambdeDeom ld = ((x, y) -> {
System.out.println("hello");
return x + y;//传进来和使用保持一致
});
int d = ld.test2(10, 5);//这边才传用的值
System.out.println(d);//遍历也可以用lambda表达式
al.forEach((e) -> {
System.out.println(e);
});
使用@FunctionalInterface修饰的接口就是功能函数接口,只允许有一个抽象方法
@FunctionalInterface
//lambda表达式的接口里面只能写一个抽象方法,因为若有多个,那边方法体中不知道调用哪一个
//使用@FunctionalInterface修饰的接口就是功能函数接口,只允许有一个抽象方法
public interface lambdeDeom {
//void test();
// void test1(String a,String b);
int test2(int a, int b);//抽象方法。
}
Stream流
Stream流是与IO流完全不同的流,它是提供对集合和数组进行更丰富的操作,而且还不影响原集合和原数组的数据。
获取流
获取流的四种方式
集合获取
Stream<String> stream = al.stream();//将集合中的元素添加到流中
数字组获取
//数组获取流 Arrays.stream(数组)
int [] x={1,2,3,4};
IntStream stream1 = Arrays.stream(x);
Stream.of获取,它的长度是可变的,里面存在自增
//Stream.of(1, 2, 3, 4, 5)直接获取流
Stream<Integer> stream2 = Stream.of(1, 2, 3, 4, 5);//可变长度参数
字符流中read.lines();可以将程序中字符存入到Stream中
对流进行操作,分为中间操作和终端操作
中间操作:可以有多个,每次可以返回一个新的流,可进行链式操作。
终端操作:只能有一个,而且执行完,这个流也用完了,后面不能在执行新的操作,因此也是放在最后。
* 流操作
* 中间操作 返回的还是Stream过滤,排序,去重...
* 终端操作 获取你最终想要的数据 tolist toset max min
* */
List<String> c = stream.filter((e) -> {return e.equals("c");})//中间操作,返回的还是stream
.collect(Collectors.toList());//终端操作