之前简单了说了lambda表达式和stream流的一些基本知识,今天就来总结一些java8中常用的奇技淫巧。 回顾请点击java 8 (一、二)
- 取代if判断的方法.filter(x -> x >0)返回boolean类型,支持lambda表达式
//stream 过滤出大于18岁的学生集合
students.stream().filter(student -> student.getAge() > 18)
- 去重.distinct()无参数,对于去除集合里面重复的值,不要太方便了,如果你要去除对象中一个属性值的重复,就需要用到map了(不是集合类里面的那个)
studentsIds.stream().distinct()
- .map()改变原来流的结构,并组成新的流,支持lambd表达式。看你的需求自由发挥了
students.stream().map(Student::getName)
- .flatMap()之前让我最难理解的,其实就是将数据扁平化,举个例子就明白了:现在有一个班级的几个,我要拿到所有学生的集合
public class ClassGrade {
/**
* 班级里的学生
*/
private List<Student> students;
}
classGrades.stream().flatMap(classGrade -> classGrade.getStudents().stream())
-
排序sorted()方法记得用支持自定义排序规则
-
limit()像mysql limit的用法类型
-
count()计算数量,类似于size(),但是返回值是long
一般将集合stream()了,都需要返回一个新的stream回去。我们正常使用的都是对象或者是集合
/**
* Returns a sequential {@code Stream} with this collection as its source.
*
* <p>This method should be overridden when the {@link #spliterator()}
* method cannot return a spliterator that is {@code IMMUTABLE},
* {@code CONCURRENT}, or <em>late-binding</em>. (See {@link #spliterator()}
* for details.)
*
* @implSpec
* The default implementation creates a sequential {@code Stream} from the
* collection's {@code Spliterator}.
*
* @return a sequential {@code Stream} over the elements in this collection
* @since 1.8
*/
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
- 最最常用的.collect(Collectors.toList());将处理的Stream转为List,大概用法是这样子:
//正常肯定不会这样子写,需要根据业务处理
students.stream().collect(Collectors.toList());
- 除了转List肯定有Map,当然toSet()也有的 第一参数是map的key,第二个参数map的value,第三个参数是存在相同的key去哪个值,当然toMap也支持两个参数,没有最后一个参数
students.stream().collect(Collectors.toMap(
Student::getId,
Student::getName,
(oldStudent, newStudent) -> oldStudent
));
-
findFirst()返回第一个值/findAny()返回任意一个值,返回的都是Optional对象(上一张已经详细说过了,怎么处理Optional可翻阅java 8 (一、二))
-
reduce()累加器, 返回所有年级的和
students.stream().map(Student::getAge).reduce(0, (s1, s2) -> s1 + s2);
- min()/max()顾名思义,我就不解释了
差不了,我把Stream类大部分常用方法都列出了,反正记得用就好,大家有兴趣还是可以看看Stream的实现类源码,看看是怎么实现这些方法的。
还有一点java8提供了一个并发流,实现的方法也很简单的——.parallelStream(),接下来大家就可以并发处理流了。