java se 8 学习(三、集合处理的奇技淫巧)

1,026 阅读2分钟

之前简单了说了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(),接下来大家就可以并发处理流了。

这章就算给前面两章做一个总结吧,字数虽少,就当笔记了

实例 github.com/Radicalpro/…