List<Person> persons = asList(new Person("Joe" ), new Person( "Jim" ), new Person( "John" )); forEach(persons).setLastName( "Doe" );
Java8类似这种遍历方式如下: persons.forEach(p -> p.setLastName("Doe")) Java8 JDK主要引入了一个新的API: Stream API来处理大数据 ,可以用集合执行filter/map/reduce-之类的操作。 使用Stream APIk可以对一个数据流实现顺序或并行操作。
ist<Person> persons = … // sequential version Stream<Person> stream = persons.stream();//parallel version Stream<Person> parallelStream = persons.parallelStream();
java.util.stream.Stream提供了一种操作大量数据接口,当得到一个stream实例后,能够实现下面有趣的集合操作: 1.Filter 过滤操作是首先很自然的一个操作(类似SQL where查询语句)
List<Person> persons = … Stream<Person> personsOver18 = persons.stream().filter(p -> p.getAge() > 18);
(banq注:有了这样强大过滤功能,以后过滤查询别老是惦记着用SQL语句了,负载都集中到数据库上了,如果数据量再大就用hadoop/hive)。 2. MAP 当我们有了过滤好的数据,我们能够实现业务操作,比如对象迁移。如果使用内部类是如下代码:
Stream<Student> students = persons.stream() .filter(p -> p.getAge() > 18) .map(new Function<Person, Student>() { @Overridepublic Student apply(Person person) {return new Student(person); } });
但是使用lambda语法很简单:
Stream<Student> map = persons.stream() .filter(p -> p.getAge() > 18) .map(person -> new Student(person));
因为mao方法参数是一种函数参数consumer,因此我们还可以传入方法如下:
Stream<Student> map = persons.stream() .filter(p -> p.getAge() > 18) .map(Adult::new );
前面我们已经实现对数据流的操作,最后我们需要收集总结这些数据结果,collect() 让我们实现这点:
List<Student> students = persons.stream() .filter(p -> p.getAge() > 18) .map(Adult::new ) .collect(new Collector<Student, List<Student>>() { … });
上面实现了自己的Collector接口,大部分情况下可能不需要:
List<Student> students = persons.stream() .filter(p -> p.getAge() > 18) .map(Student::new ) .collect(Collectors.toList());
也可以指定集合具体类型:
List<Student> students = persons.stream() .filter(p -> p.getAge() > 18) .map(Student::new ) .collect(Collectors.toCollection(ArrayList::new ));
有关顺序和并行操作: Stream API并不需要显式声明顺序或并行,在进行consumer时是并行,然后切换到顺序:
List<Student> students = persons.stream() .parallel() .filter(p -> p.getAge() > 18) // filtering will be performed concurrently .sequential() .map(Student::new ) .collect(Collectors.toCollection(ArrayList::new ));
filter函数默认是并行操作。
转载于:https://www.cnblogs.com/feika/p/4464209.html