注意:流一旦使用了终止操做流就关闭了,若是要继续使用一样的数据源,则需从新获取流java
filter(Predicate p) : 接收 Lambda , 从流中排除某些元素。
distinct() : 筛选,经过流所生成元素的 hashCode() 和 equals() 去除重复元素,因此要根据实际状况编写这两个方法
limit(long maxSize) : 截断流,使其元素不超过给定数量。找到知足条件的数据就会终止内循环
skip(long n) : 跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则返回一个空流。与 limit(n) 互补
sorted(comparator c): 对流中的元素进行排序dom
List<Cust> custs = Arrays.asList( new Cust(101,"梅西",30,33000000L), new Cust(102,"伊布",35,23000000L), new Cust(103,"哈维",34,20000000L), new Cust(104,"伊列斯塔",33,18000000L), new Cust(105,"小罗",37,15000000L), new Cust(106,"内马尔",27,32000000L), new Cust(106,"内马尔",27,32000000L), new Cust(106,"姆巴佩",23,30500000L) ); public void test2() { //找出工资排名前三位的不重复的人,且年龄要小于等于30 Stream<Cust> sm1 = custs.stream(); sm1.filter((x)->x.getAge()<=30) .sorted((x,y)->{ if(x.getSalary()>y.getSalary()) return 1; else if(x.getSalary()<y.getSalary()) return 0; else return -1; }) .distinct() .limit(3) .forEach(System.out::println); System.out.println("######################"); //找出工资排名第二和第三位不重复的人,且年龄要小于等于30 Stream<Cust> sm2 = custs.stream(); sm2.filter((x)->x.getAge()<=30) .sorted((x,y)->{ if(x.getSalary()>y.getSalary()) return 1; else if(x.getSalary()<y.getSalary()) return 0; else return -1; }) .distinct() .skip(1) .limit(2) .forEach(System.out::println); }
真的好强大,之前要写多少代码才能够完成的事情,只须要一句就搞定。函数
filter((x)->x.getAge()<=30)spa
过滤年龄大于30的元素code
sorted((x,y)->{
if(x.getSalary()>y.getSalary())
return 1;
else if(x.getSalary()<y.getSalary())
return 0;
else
return -1;
})对象
对过滤的结果按照工资降序排序排序
distinct()ip
对有序的结果集排重get
limit(3)hash
只取结果集的前三个元素
foreach(System.out::println)
终止操做,使用方法引用(对象::实例方法名)打印出结果集
map(Function f) :接收一个函数做为参数,该函数会被应用到每一个元素上,并将其映射成一个新的元素。
mapToDouble(ToDoubleFunction f) :接收一个函数做为参数,该函数会被应用到每一个元素上,产生一个新的 DoubleStream。
mapToInt(ToIntFunction f) : 接收一个函数做为参数,该函数会被应用到每一个元素上,产生一个新的 IntStream。
mapToLong(ToLongFunction f) :接收一个函数做为参数,该函数会被应用到每一个元素上,产生一个新的 LongStream。
@Test public void test3() { //map类型:将每一个元素通过处理转换成另一个类型(能够是同类型) List<String> names = Arrays.asList("姚明","科比","乔丹","詹姆斯"); names.stream().map(Cust::new).forEach(System.out::println); System.out.println("###################################"); List<String> dbls = Arrays.asList("11","22","33","44"); dbls.stream().mapToDouble(Double::parseDouble).forEach(System.out::println); System.out.println("###################################"); dbls.stream().mapToInt(Integer::parseInt).forEach(System.out::println); System.out.println("###################################"); dbls.stream().mapToLong(Long::parseLong).forEach(System.out::println); System.out.println("###################################"); }
flatMap(Function f) : 接收一个函数做为参数,将流中的每一个值都换成另外一个流,而后把全部流链接成一个流
一样还有flatMapToInt(),flatMapToLong(),flagMapToDouble(),用法和flatMap一致,只是要求最终处理出来的元素是对应的Int,Long,Double
@Test public void test4() { //flatMap类型:将为每一个元素建立一个流,并最终合并成一个流 List<List> lp = new ArrayList(); for(int i=0;i<3;i++) { List<Double> lc = new ArrayList(); for(int j=0;j<10;j++) { lc.add(Math.random()); } lp.add(lc); } lp.stream().flatMap((x)->x.stream()).forEach(System.out::println); }