在C#中我会使用Enumerable.Empty(),但是如何Stream在Java中创建一个空?
我正在寻找最无痛的方法来过滤集合.我在想类似的东西
Collection<?> foo = existingCollection.stream().filter( ... ). ...
Run Code Online (Sandbox Code Playgroud)
但我不确定如何最好从过滤器,返回或填充另一个集合.大多数例子似乎都像"在这里你可以打印".可能有一个我缺少的构造函数或输出方法.
我花了一些时间开始研究关于流和lambdas的java-8嗡嗡声.让我吃惊的是,你不能应用流操作,例如.map(),.filter()直接上java.util.Collection.是否存在技术原因导致java.util.Collection接口未通过这些Stream操作的默认实现进行扩展?
谷歌搜索了一下,我看到很多人按照以下模式编码的例子:
List<String> list = someListExpression;
List<String> anotherList = list.stream().map(x -> f(x)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
如果你的代码中有很多这些流操作,那就变得非常笨拙了.由于.stream()并且.collect()与您想表达的内容完全无关,您宁愿说:
List<String> list = someListExpression;
List<String> anotherList = list.map(x -> f(x));
Run Code Online (Sandbox Code Playgroud) 我正在观看关于Java的演讲,有一次,讲师说:
"可变性是可以的,分享是好的,共享的可变性是魔鬼的工作."
他所指的是以下一段代码,他认为这是一种"极其糟糕的习惯":
//double the even values and put that into a list.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 1, 2, 3, 4, 5);
List<Integer> doubleOfEven = new ArrayList<>();
numbers.stream()
.filter(e -> e % 2 == 0)
.map(e -> e * 2)
.forEach(e -> doubleOfEven.add(e));
Run Code Online (Sandbox Code Playgroud)
然后他继续编写应该使用的代码,即:
List<Integer> doubleOfEven2 =
numbers.stream()
.filter(e -> e % 2 == 0)
.map(e -> e * 2)
.collect(toList());
Run Code Online (Sandbox Code Playgroud)
我不明白为什么第一段代码是"坏习惯".对我而言,他们都达到了同样的目标.
我有以下情况需要从流中删除元素.
map.entrySet().stream().filter(t -> t.getValue().equals("0")).
forEach(t -> map.remove(t.getKey()));
Run Code Online (Sandbox Code Playgroud)
在Java 8之前的代码中,可以从迭代器中删除 - 在这里处理这种情况的最佳方法是什么?
在java 8中,检查List是否包含任何重复的最佳方法是什么?
我的想法是这样的:
list.size() != list.stream().distinct().count()
Run Code Online (Sandbox Code Playgroud)
这是最好的方式吗?
为了利用java.util.streamJdk 8中包含的各种查询方法,我尝试设计域模型,其中具有*多重性(具有零个或多个实例)的关系的getter 返回a Stream<T>而不是Iterable<T>or Iterator<T>.
我怀疑的是,与此Stream<T>相比,Iterator<T>是否会产生任何额外的开销?
那么,使用Stream<T>?来破坏我的域模型是否有任何不利之处?
或者,我应该总是返回一个Iterator<T>或者Iterable<T>,并通过将该迭代器转换为StreamUtils?来让最终用户决定是否使用流.
请注意,返回a Collection不是有效选项,因为在这种情况下,大多数关系都是惰性且大小未知.
我有一个ArrayList,并希望按降序排序.我用它来做法java.util.stream.Stream.sorted(Comparator).这是根据Java API的描述:
返回由此流的元素组成的流,并根据提供的内容进行排序
Comparator.
这个方法给我一个升序排序.我应该更改哪个参数,只是为了降序?
使用Java 8 Stream从Collection中查找与Property值匹配的对象.
List<Person> objects = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
人员属性 - >姓名,电话,电子邮件.
迭代人员列表并找到匹配电子邮件的对象.看到这可以通过Java 8流轻松完成.但那还会收回一个系列吗?
例如:
List<Person> matchingObjects = objects.stream.
filter(p -> p.email().equals("testemail")).
collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但我知道它总会有一个独特的对象.我们可以做一些事情,而不是Collectors.toList直接得到实际的对象.而不是获取对象列表.
我的代码中有很多地方可以:
someStream.collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)
其中,Collectors.toList()创建于每次使用一个新的收藏家.
这引出了一个问题:是否允许和建议做以下事情:
private final static Collector<…> TO_LIST = Collectors.toList()
Run Code Online (Sandbox Code Playgroud)
对于我使用的每种类型,然后使用单个收集器,如:
someStream.collect(TO_LIST)
Run Code Online (Sandbox Code Playgroud)
当需要收藏家时
由于收藏家是无国籍的,只是一系列功能和特征,我认为它应该有效,但OTOH,每次通话都会Collectors.toList()创造一个新的CollectorImpl<>.
重用收集器的缺点是什么?
java ×10
java-stream ×10
java-8 ×8
collections ×1
comparator ×1
dictionary ×1
domain-model ×1
duplicates ×1
enumerable ×1
filter ×1
immutability ×1
iterator ×1
lambda ×1
sorting ×1