参考:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/
Java 8 中的 Streams API 详解:
Stream可以并行化操作而使用并行去遍历时,数据会被分成多个段,其中每一个都在不同的线程中处理,然后将结果一起输出。Stream 的并行操作依赖于 Java7 中引入的 Fork/Join 框架(JSR166y)来拆分任务和加速处理过程
Stream 的另外一大特点是,数据源本身可以是无限的。
-
java 并行API演变历程
1.0-1.4 中的 java.lang.Thread 5.0 中的 java.util.concurrent 6.0 中的 Phasers 等 7.0 中的 Fork/Join 框架 8.0 中的 Lam
多种生成Stream的方式:
- 从Collection生成Stream
Collection.stream()
Collection.parallelStream()
Arrays.stream(T array) or Stream.of()
从BufferReader 生成Stream
java.io.BufferedReader.lines()
-
静态工厂
java.util.stream.IntStream.range() java.nio.file.Files.walk()
自己构建
java.util.Spliterator
其他
Random.ints()
BitSet.stream()
Pattern.splitAsStream(java.lang.CharSequence)
JarFile.stream()
- 流的使用详解
简单来说,对Stream的使用就是一个filter——map——reduce的过程,产生一个最终结果 - 流的构造和转换
// 1. Individual values
Stream stream = Stream.of("a", "b", "c");
// 2. Arrays
String [] strArray = new String[] {"a", "b", "c"};
stream = Stream.of(strArray);
stream = Arrays.stream(strArray);
// 3. Collections
List<String> list = Arrays.asList(strArray);
stream = list.stream();
- List类型对象copy
List<Student> students = persons.stream().map(person -> {
Student student = new Student();
BeanUtils.copyProperties(person, student);
if (person.getName() == "张三") {
student.setSchoolName("三中");
student.setsId(3L);
}
if (person.getName() == "李四") {
student.setSchoolName("四中");
student.setsId(4L);
}
return student;
}).collect(Collectors.toList());
- List对象转map
public Map<Long, String> getIdNameMap(List<Account> accounts) {
return accounts.stream().collect(Collectors.toMap(Account::getId, Account::getUsername));
}
public Map<Long, Account> getIdAccountMap(List<Account> accounts) {
return accounts.stream().collect(Collectors.toMap(Account::getId, account -> account));
}
参考:
1 list转map在Java8中stream的应用