您的位置:首页 > 编程语言 > Java开发

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函数就会被调用,对现有的数值进行修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息