Java8学习笔记之类库的更新

2019-08-15  本文已影响0人  夏与清风
1、集合

Collection API在Java 8中重大的更新就是引入了流,此外Collection API还有一部分更新。

1)其他新增的方法
Java API的设计者们充分利用默认方法,为集合接口和类新增了多个新的方法。 集合类和接口中新增的方法
Map<String, Integer> map = new HashMap<>();
Integer count = 0;
if(map.containsKey("Aston")){
  count = map.get("Aston");
}

使用新Map接口后,只需要编写一行代码就能实现:

Integer count = map.getOrDefault("Aston", 0);

注意:此方法仅在没有映射时才生效。如果键被显式地映射到了空值,那么该方法不会返回设定的默认值。
另一个有用的方法是computeIfAbsent,它能帮助你非常方便地使用缓存模式。比如,我们假设你需要从不同的网站抓取和处理数据。这种场景下,如果能够缓存数据是非常有帮助的,这样就不需要每次都执行数据抓取操作了:

public String getData(String url){
  String data = cache.get(url);
  if(data == null){ //检查数据是否已缓存
    data = getData(url);
    cache.put(url, data); //如果数据没有缓存,就访问网站 抓取数据,紧接着对Map中的数据进行缓存
  }
  return data;
}

现在可以通过computeIfAbsent用更加精炼的方式实现:

public String getData(String url){
  return cache.computeIfAbsent(url, this::getData);
}
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.replaceAll(x -> x * 2);
System.out.println(numbers);
2)Collections类

Collections类的主要功能是操作或返回集合。Java 8中它又 新增了一个方法,该方法可以返回不可修改的、同步的、受检查的或是空的NavigableMap或NavigableSet。此外,它还引入了checkedQueue方法,该方法返回一个队列视图,可以扩展进行动态类型检查。

3)Comparator

Comparator接口现在同时包含了默认方法和静态方法。可以使用静态方法Comparator.comparing返回一个Comparator对象,该对象提供了一个函数可以提取排序关键字。
新的实例方法包含如下方法:

新的静态方法如下:

2、并发

Java 8中引入了多个与并发相关的更新,如并行流、CompletableFuture类、Arrays类现在支持并发操作。

1)原子操作

java.util.concurrent.atomic包提供了多个对数字类型进行操作的类,比如AtomicInteger和AtomicLong,它们支持对单一变量的原子操作。这些类在Java 8中新增了更多的方法支持。

int min = atomicInteger.accumulateAndGet(10, Integer::min);

Adder和Accumulator
在多线程中,如果多个线程需要频繁地进行更新操作,且很少有读取的动作,Java API文档中推荐使用新的类LongAdder、LongAccumulator、DoubleAdder及DoubleAccumulator,尽量避免使用它们对应的原子类型。这些新的类在设计之初就考虑了动态增长的需求,可以有效地减少线程间的竞争。
LongAddr和DoubleAdder类都支持加法操作,而LongAccumulator和DoubleAccumulator可以使用给定的方法整合多个值。
使用LongAdder计算多个值之和:

LongAdder adder = new LongAdder(); //使用默认构造器,初始的sum值为0
adder.add(10); //在多个不同的线程中进行加法运算
// … 
long sum = adder.sum(); //得出sum的值

使用LongAccumulator计算多个值之和:

LongAccumulator acc = new LongAccumulator(Long::sum, 0);
acc.accumulate(10); //在几个不同的线程中累计计算值
// …
long result = acc.get(); //在某个时刻得出结果
2)ConcurrentHashMap

ConcurrentHashMap类极大地提升了HashMap现代化的程度,它对并发的支持非常友好。ConcurrentHashMap允许并发地进行新增和更新操作,因为它仅对内部数据结构的某些部分上锁。和Hashtable比,它具有更高的读写性能。

这些操作不会对ConcurrentHashMap的状态上锁。它们只会在运行过程中对元素进行操作。应用到这些操作上的函数不应该对任何的顺序,或其他对象,或在计算过程发生变 化的值,有依赖。
此外,如果需要为这些操作指定一个并发阈值。如果经过预估当前map的大小小于设定的阈值,操作会顺序执行。使用值1开启基于通用线程池的大并行。使用值Long.MAX_VALUE设定程序以单线程执行操作。

ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
Optional<Integer> maxValue = Optional.of(map.reduceValues(1, Integer::max));

对int、long和double,它们的reduce操作各有不同(比如reduceValuesToInt、 reduceKeysToLong等)。

3、Arrays

Arrays类提供了不同的静态方法对数组进行操作。现在,它又包括了四个新的方法(它们都有特别重载的变量)。

1)使用parallelSort

parallelSort方法会以并发的方式对指定的数组进行排序,可以使用自然顺序,也可以为数组对象定义特别的Comparator。

2)使用setAll和parallelSetAll

setAll和parallelSetAll方法可以以顺序的方式,也可以用并发的方式,使用提供的函数计算每一个元素的值,对指定数组中的所有元素进行设置。该函数接受元素的索引,返回该索引元素对应的值。由于parallelSetAll需要并发执行,所以提供的函数必须没有任何副作用。
使用setAll方法生成一个值为0, 2, 4, 6, …的数组:

int[] numbers = new int[10];
Arrays.setAll(numbers , i -> i * 2);
3)使用parallelPrefix

parallelPrefix方法以并发的方式,用用户提供的二进制操作符对给定数组中的每个元素进行累积计算。
使用parallelPrefix并发地累积数组中的元素:

int[] ones = new int[10];
Arrays.fill(ones, 1);
Arrays.parallelPrefix(ones, (a, b) -> a + b); //ones现在的内容是[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
4、Number和Math

Java 8 API对Number和Math也做了改进,为它们增加了新的方法。

1)Number

Number类中新增的方法如下:

2)Math

如果Math中的方法在操作中出现溢出,Math类提供了新的方法可以抛出算术异常。支持这一异常的方法包括使用int和long参数的addExact、subtractExact、multipleExact、incrementExact、decrementExact和negateExact。
此外,Math类还新增了一个静态方法toIntExact,可以将long值转换为int值。其他的新增内容包括静态方法floorMod、floorDiv 和nextDown。

5、Files

Files类引人注目的改变是,可以用文件直接产生流。通过新的静态方法Files.lines,可以以延迟方式读取文件的内容,并将其作为一个流。此外,还有一些非常有用的静态方法可以返回流:

6、Reflection

Reflection API的变化就是为了支撑注解机制的改变。此外,Relection接口的另一个变化是新增了可以查询方法参数信息的API。比如,可以使用新增的java.lang.reflect.Parameter类查询方法参数的名称和修饰符,这个类被新的java.lang.reflect.Executable类所引用,而java.lang.reflect.Executable通用函数和构造函数共享的父类。

7、String

String类也新增了一个静态方法join。它可以用一个分隔符将多个字符串连接起来。

String authors = String.join(", ", "a", "b", "c");
System.out.println(authors); //a,b,c

--参考文献《Java8实战》

上一篇 下一篇

猜你喜欢

热点阅读