标签: java-stream

将集合流合并到一个集合中 - Java 8

所以我Stream<Collection<Long>>通过在另一个流上进行一系列转换来获得.

我需要做的是收集Stream<Collection<Long>>成一个Collection<Long>.

我可以将它们全部收集到这样的列表中:

<Stream<Collection<Long>> streamOfCollections = /* get the stream */;

List<Collection<Long>> listOfCollections = streamOfCollections.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

然后我可以遍历该集合列表,将它们合并为一个集合.

但是,我想必须有一种简单的方法将集合流合并为一个或Collection<Long>一个.我只是想不出怎么做.有任何想法吗?.map().collect()

java collections java-8 java-stream

30
推荐指数
2
解决办法
2万
查看次数

可以跳过 Stream.peek() 进行优化

我在 Sonar 中发现了一条规则:

与其他中间 Stream 操作的一个关键区别是 Stream 实现可以自由地跳过调用以peek()达到优化目的。这可能会导致peek()意外地仅调用 Stream 中的部分元素或不调用任何元素。

另外,Javadoc中也提到了这一点:

此方法的存在主要是为了支持调试,您希望在元素流经管道中的某个点时查看它们

什么情况下可以java.util.Stream.peek()跳过?和调试有关系吗?

java side-effects java-8 java-stream sonarqube

30
推荐指数
2
解决办法
4144
查看次数

如何从可空对象中最好地创建Java 8流?

在获取流之前进行空检查的最佳/惯用方法是什么?

我有接收List可能为null的方法.所以我不能只调用.stream()传入的值.是否有一些静态助手,如果值为null,会给我一个空流?

java java-8 java-stream

29
推荐指数
5
解决办法
2万
查看次数

如何在Stream上短路reduce()操作?

这与如何在Stream上短路减少基本相同?.但是,由于这个问题集中在一个布尔值流,并且其答案不能推广到其他类型并减少操作,我想问更一般的问题.

我们如何在流上进行减少,以便在遇到减少操作的吸收元件时发生短路?

乘法的典型数学例子是0.这个Stream:

int product = IntStream.of(2, 3, 4, 5, 0, 7, 8)
        .reduce(1, (a, b) -> a * b);
Run Code Online (Sandbox Code Playgroud)

将消耗最后两个元素(7和8),无论一旦0遇到产品已知的事实.

java java-8 java-stream

29
推荐指数
2
解决办法
2054
查看次数

在不收集Java8流的情况下对其进行分组

Java 8中是否有任何方法可以将元素分组java.util.stream.Stream而不收集它们?我希望结果Stream再次出现.因为我必须处理大量数据甚至无限流,所以我无法先收集数据并再次流式传输结果.

需要分组的所有元素在第一个流中是连续的.因此我喜欢让流评估保持懒惰.

java grouping java-8 java-stream

29
推荐指数
1
解决办法
4409
查看次数

Java 8 Stream API - 任何有状态的中间操作都能保证新的源集合吗?

以下陈述是真的吗?

(来源和来源 - 他们似乎互相复制或来自同一来源.)

该sorted()操作是"有状态的中间操作",这意味着后续操作不再对后备集合进行操作,而是对内部状态进行操作.

我已经测试Stream::sorted过以上来源的片段:

final List<Integer> list = IntStream.range(0, 10).boxed().collect(Collectors.toList());

list.stream()
    .filter(i -> i > 5)
    .sorted()
    .forEach(list::remove);

System.out.println(list);            // Prints [0, 1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

有用.我替换Stream::sorted为Stream::distinct,Stream::limit和Stream::skip:

final List<Integer> list = IntStream.range(0, 10).boxed().collect(Collectors.toList());

list.stream()
    .filter(i -> i > 5)
    .distinct()
    .forEach(list::remove);          // Throws NullPointerException
Run Code Online (Sandbox Code Playgroud)

令我惊讶的NullPointerException是,它被扔了.

所有测试方法都遵循有状态中间操作特性.然而,Stream::sorted没有记录这种独特的行为,Stream操作和管道部分解释了有状态中间操作是否真正保证了新的源集合.

我的困惑来自何处以及上述行为的解释是什么?

java java-8 java-stream

29
推荐指数
2
解决办法
1352
查看次数

如何从“设置/地图”中删除多个元素并知道删除了哪些元素?

我有一种方法必须Set<K> keysToRemove从一些(可能大)中删除(小)中列出的任何元素Map<K,V> from。但是removeAll()不这样做,因为我需要返回实际上已删除的所有键,因为映射可能包含或可能不包含需要删除的键。

老式的代码很简单:

public Set<K> removeEntries(Map<K, V> from) {
    Set<K> fromKeys = from.keySet();
    Set<K> removedKeys = new HashSet<>();
    for (K keyToRemove : keysToRemove) {
        if (fromKeys.contains(keyToRemove)) {
            fromKeys.remove(keyToRemove);
            removedKeys.add(keyToRemove);
        }
    }
    return removedKeys;
}
Run Code Online (Sandbox Code Playgroud)

使用流写的相同:

Set<K> fromKeys = from.keySet();
return keysToRemove.stream()
        .filter(fromKeys::contains)
        .map(k -> {
            fromKeys.remove(k);
            return k;
        })
        .collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

我发现这更加简洁,但是我也发现lambda太笨拙了。

任何建议如何以较少笨拙的方式实现相同结果?

java lambda java-stream

29
推荐指数
3
解决办法
1458
查看次数

使用流,如何在HashMap中映射值?

鉴于一个Map<String, Person>地方的人有一个String getName()就可以了(等)的方法,我怎么能转Map<String, Person>成Map<String, String>,其中String从调用获得Person::getName()?

我会使用Pre-Java 8

Map<String, String> byNameMap = new HashMap<>();

for (Map.Entry<String, Person> person : people.entrySet()) {
    byNameMap.put(person.getKey(), person.getValue().getName());
}
Run Code Online (Sandbox Code Playgroud)

但是我想用流和lambdas来做.

我无法看到如何以功能样式执行此操作:Map/HashMap不实现Stream.

people.entrySet()返回Set<Entry<String, Person>>我可以流过的内容,但是如何Entry<String, String>向目标地图添加新内容?

java java-8 java-stream

28
推荐指数
2
解决办法
9001
查看次数

将Stream转换为IntStream

我有一种感觉,我在这里遗漏了一些东西.我发现自己做了以下事情

private static int getHighestValue(Map<Character, Integer> countMap) {
    return countMap.values().stream().mapToInt(Integer::intValue).max().getAsInt();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是从愚蠢的转换Stream到 IntStream通过mapToInt(Integer::intValue)

有没有更好的转换方式?这一切都是为了避免使用max()从Stream,这需要传递一个Comparator但问题是专门对的皈依Stream到IntStream

java java-8 java-stream

28
推荐指数
3
解决办法
1万
查看次数

Java8 Stream:满足条件后收集元素

我的POJO如下

class EventUser {
  private id;
  private userId;
  private eventId;
}
Run Code Online (Sandbox Code Playgroud)

我按如下方式检索EventUser对象:

List<EventUser> eventUsers = eventUserRepository.findByUserId(userId);
Run Code Online (Sandbox Code Playgroud)

说'eventUsers'如下:

[
{"id":"id200","userId":"001","eventId":"1010"},
{"id":"id101","userId":"001","eventId":"4212"},
{"id":"id402","userId":"001","eventId":"1221"},
{"id":"id301","userId":"001","eventId":"2423"},
{"id":"id701","userId":"001","eventId":"5423"},
{"id":"id601","userId":"001","eventId":"7423"}
]
Run Code Online (Sandbox Code Playgroud)

使用流式传输,而不使用任何中间变量,如何在给定的EventUser.id之后过滤和收集事件:ex:

List<EventUser> filteredByOffSet = eventUsers.stream.SOMEFILTER_AND_COLLECT("id301");
Run Code Online (Sandbox Code Playgroud)

结果应该是:

[{"id":"id301","userId":"001","eventId":"2423"},
{"id":"id701","userId":"001","eventId":"5423"},
{"id":"id601","userId":"001","eventId":"7423"}]
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

28
推荐指数
3
解决办法
3598
查看次数