3.Java 8新特性概述(三)
2018-03-12 21:31
239 查看
Parallel Streams
如之前所说的,流操作可以是顺序的,也可以是并行的。顺序操作是单线程运行的,而并行操作是多线程运行的。下面的例子就演示了如何使用并行流进行操作来提高运行效率,代码非常简单。首先我们创建一个大的list,里面的元素都是唯一的:int max = 1000000;List<String> values = new ArrayList<>(max);
for (int i = 0; i < max; i++) {
UUID uuid = UUID.randomUUID(); //保证生成的UUID是唯一的
values.add(uuid.toString());
}
顺序排序
long t0 = System.nanoTime(); long count = values.stream().sorted().count(); System.out.println(count); long t1 = System.nanoTime(); long millis = TimeUnit.NANOSECONDS.toMillis(t1 - t0); System.out.println(String.format("sequential sort took: %d ms", millis)); // sequential sort took: 899 ms
并行排序
long t0 = System.nanoTime(); long count = values.parallelStream().sorted().count(); System.out.println(count); long t1 = System.nanoTime(); long millis = TimeUnit.NANOSECONDS.toMillis(t1 - t0); System.out.println(String.format("parallel sort took: %d ms", millis)); // parallel sort took: 472 ms所有的代码段几乎都相同,唯一的不同就是把stream()改成了parallelStream(),结果并行排序快了50%。
Map
正如前面已经提到的那样,map是不支持流操作的。而更新后的map现在则支持多种实用的新方法,来完成常规的任务。Map<Integer, String> map = new HashMap<>();for (int i = 0; i < 10; i++) {
map.putIfAbsent(i, "val" + i);
}
map.forEach((id, val) -> System.out.println(val)); 上面的代码风格是完全自解释的:putIfAbsent避免我们将null写入;forEach接受一个消费者对象,从而将操作实施到每一个map中的值上。
下面的这个例子展示了如何使用函数来计算map的编码;
map.computeIfPresent(3, (num, val) -> val + num); map.get(3); // val33 map.computeIfPresent(9, (num, val) -> null); map.containsKey(9); // false map.computeIfAbsent(23, num -> "val" + num); map.containsKey(23); // true map.computeIfAbsent(3, num -> "bam"); map.get(3); // val33接下来,我们将学习,当给定一个key值时,如何把一个实例从对应的key中移除:map.remove(3, "val3");
map.get(3); // val33
map.remove(3, "val33");
map.get(3); // null 另一个有用的方法:
map.getOrDefault(42, "not found"); // not found将map中的实例合并也是非常容易的:map.merge(9, "val9", (value, newValue) -> value.concat(newValue));
map.get(9); // val9
map.merge(9, "concat", (value, newValue) -> value.concat(newValue));
map.get(9); // val9concat 合并操作先看map中是否没有特定的key/value存在,如果是,则把key/value存入map,否则merging函数就会被调用,对现有的数值进行修改。
相关文章推荐
- Java 8 新特性概述
- 黑马程序员——java基础(面向对象)概述、类、三大特性
- JAVA基础【1.2】《Java核心技术1》Java程序设计概述-Java JDK1.5新特性【收集】
- java高级特性之集合概述
- JAVA基础【1.3】《Java核心技术1》Java程序设计概述-Java JDK1.6新特性【收集】
- Java 8 新特性概述
- Java8新特性概述
- Java8特性总结(一)概述
- Java 9 新特性概述
- JAVA基础【1.4】《Java核心技术1》Java程序设计概述-Java JDK1.7新特性【收集】
- Java 8 新特性概述
- Java 9 新特性概述
- java高级特性之集合概述 其二
- Java 8 新特性概述
- 1.Java 8新特性概述(一)
- 2.Java 8新特性概述(二)
- java语言特性概述
- JAVA基础【1.5】《Java核心技术1》Java程序设计概述-Java JDK1.8新特性【收集】
- javaSE_8系列博客——Java语言的特性(三)--类和对象(1)--概述
- 黑马程序员——java5特性之枚举和泛型概述