java lambda stream,lambda stream用法
目录
流流量
Lambda
Lambda表达式是一个匿名函数。我们可以把lambda表达式理解为一段可以传递的代码(像传递数据一样传递代码段)。它可以用来编写更加简洁和灵活的代码。作为一种更紧凑的代码风格,java语言的表达能力得到了提高。
众所周知,Lambda表达式的存在是为了简化语法。
ArrayList string list=new ArrayList();list . add( a );list . add( b );list . add( c );list . add( d );list . sort(new comparator String(){ @ Override public int compare(String O1,String O2){ return O2.compare to(O1);}});system . out . println(list);这是一个列表集,添加了一些元素。我们想对它进行排序,按降序排列。在接触Lambda表达式之前,我们先做上面的。
上面的方法是匿名的内部类编写。当调用sort()方法时,需要传入一个比较器。比较器是一个接口。界面可以是新的吗?肯定不是,所以这里有一个隐藏类,它实现了Comparator接口,并重写了它的compare()方法来制定我们的比较规则。这个隐藏类没有类名,也就是我们这里所说的匿名内部类,但是方法不能作为参数传递,所以我们更新了这个匿名内部类的对象,包装了实现的方法。
但是现在我们觉得这个写法太罗嗦了。我们用Lambda来看看。
//Lambda表达式list.sort ((o1,O2)-{ return O2.compare to(O1);});这和上面写的匿名内部类是一样的
Lambda表达式:的结构
左:lambda表达式的参数列表
右侧:lambda表达式中要执行的函数,即lambda体。
(arg1,arg2.)- { body }
(类型1 arg1,类型2 arg2.)- { body }
常见示例
{}在lambda体中没有参数,没有返回值,只有一行代码的情况下,可以忽略()-system . out . println( hello world )。
无参数,返回值()-{ return 3.1415 };
参数,无返回值(字符串s)-{ system . out . println(s);}
有一个参数没有返回值s-{ system . out . println(s);}
有多个参数有返回值(int a,int b)-{ return a b;}
有多个参数,表达式参数类型可以不写,jvm可以做类型推断(a,b)-{返回a-b;}
功能接口
一般在接口上有这样一个标注标签@FunctionalInterface,表示这个接口只有一个抽象方法。当你注释的接口违反了函数接口的契约时,可以用于编译器级别的错误。
比如3360,我们刚才用的比较仪界面就有这样的注释。
00-1010允许您以声明的方式处理数据集。你可以把它想象成一个遍历数据集的高级迭代器。另外,stream和lambada表达式的结合表明编码效率大大提高,可读性更强。
流更倾向于数据处理和计算,比如过滤、映射、查找、排序等。简单来说,我们通过一个集合的stream方法得到一个流,然后对这个流进行一系列的流操作,最后构建出我们需要的数据集。
我们经常把Stream和Lambda表达式结合起来编码,那么如何使用呢?
有三步,
1.去找小溪
2.中间操作
3.终端操作
中间操作(通常是过滤数据)
过滤:过滤流中的一些元素
orted(): 自然排序,流中元素需实现 Comparable 接口distinct: 去除重复元素limit(n): 获取 n 个元素skip(n): 跳过 n 元素,配合 limit(n)可实现分页map(): 将其映射成一个新的元素终端操作(往往对结果集进行处理)
forEach: 遍历流中的元素toArray:将流中的元素倒入一个数组Min:返回流中元素最小值 Max:返回流中元素最大值count:返回流中元素的总个数Reduce:所有元素求和anyMatch:接收一个 Predicate 函数,只要流中有一个元素满足条件则返回 true,否则返回falseallMatch:接收一个 Predicate 函数,当流中每个元素都符合条件时才返回 true,否则返回 falsefindFirst:返回流中第一个元素collect:将流中的元素倒入一个集合,Collection 或 Map
Integer[] arr = new Integer[]{1,4,3,2,5,5};Arrays.stream(arr) //拿到流 .filter((a) -> {return a>3;}) //中间操作,过滤 .forEach((a) -> { //终端操作,遍历 System.out.println(a); });Integer[] arr = new Integer[]{1,4,3,2,5,5};Object[] objects = Arrays.stream(arr) .sorted().distinct() //排序并去重 .toArray(); //转数组System.out.println(Arrays.toString(objects));Integer[] arr = new Integer[]{1,4,3,2,5,5};Integer max = Arrays.stream(arr).distinct() .max(((o1, o2) -> { //去重返回最大值 return o1 - o2; })).get(); //拿到这个值//此处max为终端操作,返回的已经不是流,而是一个OPtion的对象//它里面有一个get()方法可以返回这个值System.out.println(max);Integer[] arr = new Integer[]{1,4,3,2,5,5};long count = Arrays.stream(arr).distinct() .count(); //返回总个数System.out.println(count);Integer[] arr = new Integer[]{1,4,3,2,5,5};Integer i = Arrays.stream(arr).distinct() .reduce((o1, o2) -> { //所有元素求和 return o1 + o2; }) .get();System.out.println(i);
这里需要注意的是中间操作的map()方法和终端操作的collect()方法
设计一个Apple类
public class Apple { private Integer num; private String name; private String color;}
并给出 构造 , set 和 get 方法 ,此处由于篇幅 原因省略
List<Apple> list = new ArrayList<>();list.add(new Apple(100,"苹果1","红色"));list.add(new Apple(105,"苹果5","红色"));list.add(new Apple(104,"苹果4","红色"));list.add(new Apple(103,"苹果3","红色"));list.add(new Apple(102,"苹果2","红色"));
往一个list添加5个元素
List<String> collect = list.stream() //将属性的一列通过get方法映射成流 .map(Apple::getName) //转为一个list集合 .collect(Collectors.toList());System.out.println(collect);List<Apple> collect = list.stream().sorted(((o1, o2) -> { //通过num属性自定义排序 return o1.getNum() - o2.getNum(); })) //转为一个list集合 .collect(Collectors.toList());System.out.println(collect);Map<Integer, String> map = list.stream().sorted(((o1, o2) -> { return o1.getNum() - o2.getNum(); })) //转map, 第一个参数为键,第二个参数为值 .collect(Collectors.toMap(Apple::getNum, Apple::getName));System.out.println(map);
到此关于Lambda表达式与Stream流就介绍完了,感谢阅读
到此这篇关于Java详细分析Lambda表达式与Stream流的使用方法的文章就介绍到这了,更多相关Java Lambda与Stream内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。