所以我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()
我在 Sonar 中发现了一条规则:
与其他中间 Stream 操作的一个关键区别是 Stream 实现可以自由地跳过调用以
peek()达到优化目的。这可能会导致peek()意外地仅调用 Stream 中的部分元素或不调用任何元素。
另外,Javadoc中也提到了这一点:
此方法的存在主要是为了支持调试,您希望在元素流经管道中的某个点时查看它们
什么情况下可以java.util.Stream.peek()跳过?和调试有关系吗?
在获取流之前进行空检查的最佳/惯用方法是什么?
我有接收List可能为null的方法.所以我不能只调用.stream()传入的值.是否有一些静态助手,如果值为null,会给我一个空流?
这与如何在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 8中是否有任何方法可以将元素分组java.util.stream.Stream而不收集它们?我希望结果Stream再次出现.因为我必须处理大量数据甚至无限流,所以我无法先收集数据并再次流式传输结果.
需要分组的所有元素在第一个流中是连续的.因此我喜欢让流评估保持懒惰.
以下陈述是真的吗?
该
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操作和管道部分解释了有状态中间操作是否真正保证了新的源集合.
我的困惑来自何处以及上述行为的解释是什么?
我有一种方法必须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太笨拙了。
任何建议如何以较少笨拙的方式实现相同结果?
鉴于一个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>向目标地图添加新内容?
我有一种感觉,我在这里遗漏了一些东西.我发现自己做了以下事情
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
我的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 ×10
java-stream ×10
java-8 ×9
collections ×1
grouping ×1
lambda ×1
side-effects ×1
sonarqube ×1