Top stackoverflow 问答系列之Java 8 Stream 篇 (一)

凤经武
2023-12-01

从Java 8 2014 发布到现在,已有三年多了,JDK 8 也得到了广泛的应用,但似乎Java 8里面最重要的特性:Lambdas和Stream APIs对很多人来说还是很陌生。想通过介绍Stackoverflow一些实际的问题和答案来讲解在现实开发中我们可以通过Lambdas和Stream APIs可以做些什么,以及什么是正确的姿势。在介绍那些问答之前,我们先要对Java 8 和Stream APIs有些基本的了解,这里推荐几篇文章:

如果你对Java 8 Lambds和Stream APIs还不是很了解,建议先把上面的几篇文章看几遍。
接下来是问答:


1. Java 8 List<V> into Map<K, V>
有一个List<Choice> choices, 要把它转换成一个Map<String, Choice>, Map的Key是Choice的名称,Value是Choice,如果用Java 7,代码将是:

private Map<String, Choice> nameMap(List<Choice> choices) {
    final Map<String, Choice> hashMap = new HashMap<>();
    for (final Choice choice : choices) {
        hashMap.put(choice.getName(), choice);
    }
    return hashMap;
}

【答案】
如果能确保Choicename没有重复的

Map<String, Choice> result =
        choices.stream().collect(Collectors.toMap(Choice::getName,
                                              Function.identity()));

如果name有重复的,上面的代码会抛IllegalStateException,要用下面的代码,

Map<String, List<Choice>> result =
        choices.stream().collect(Collectors.groupingBy(Choice::getName));

2. How to Convert a Java 8 Stream to an Array?
什么是最简便的方式把一个Stream转换成数组:

【答案】

String[] strArray = Stream.of("a", "b", "c")toArray(size -> new String[size]);

int[] intArray = IntStream.of(1, 2, 3).toArray();

3.Retrieving a List from a java.util.stream.Stream in Java 8
怎么把一个Stream转换成List?下面是我的尝试:

List<Long> sourceLongList = Arrays.asList(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L);
List<Long> targetLongList = new ArrayList<>();
sourceLongList.stream().filter(l -> l > 100).forEach(targetLongList::add);

【答案】

targetLongList = sourceLongList.stream()
        .filter(l -> l > 100)
        .collect(Collectors.toList());

这一篇的目的主要以学习前面推荐的几篇文章为主,和介绍了几个简单的问题,接下来在第二篇会介绍更多有兴趣的问答。

【更新】更多请参阅:Abacus-util.

 类似资料: