Java spect表示,在大多数情况下,运行两个流会更高效……我非常喜欢使用limit()。好主意!!不幸的是,解决方案仍然存在一个问题,即模型的临时映射可能会消耗大量内存。我用过汽车,但想象一下现在是人,我有数百万人。在这种情况下,如果两个人在列表的末尾,临时映
Java spect表示,在大多数情况下,运行两个流会更高效……我非常喜欢使用limit()。好主意!!不幸的是,解决方案仍然存在一个问题,即模型的临时映射可能会消耗大量内存。我用过汽车,但想象一下现在是人,我有数百万人。在这种情况下,如果两个人在列表的末尾,临时映,java,java-8,java-stream,Java,Java 8,Java Stream,spect表示,在大多数情况下,运行两个流会更高效……我非常喜欢使用limit()。好主意!!不幸的是,解决方案仍然存在一个问题,即模型的临时映射可能会消耗大量内存。我用过汽车,但想象一下现在是人,我有数百万人。在这种情况下,如果两个人在列表的末尾,临时映射可以在内存中保存数百万个字符串以查找两个人:(@ByeBye No,在distinct()之后,可能存在一个无限流,其中只包含通过过滤器的不同项。限制为限制(2),当流发出第二个项目时,流的处理停止。这使短路快速成功。是的,我想这可能是答案。
spect表示,在大多数情况下,运行两个流会更高效……我非常喜欢使用limit()。好主意!!不幸的是,解决方案仍然存在一个问题,即模型的临时映射可能会消耗大量内存。我用过汽车,但想象一下现在是人,我有数百万人。在这种情况下,如果两个人在列表的末尾,临时映射可以在内存中保存数百万个字符串以查找两个人:(@ByeBye No,在
distinct()
之后,可能存在一个无限流,其中只包含通过过滤器的不同项。限制为限制(2)
,当流发出第二个项目时,流的处理停止。这使短路快速成功。是的,我想这可能是答案。小而微妙的细节。@123 xyz只是想装模作样/偷懒。.filter(model->model.equals(“Focus”)| model.equals(“Civic”))
会起作用,而且可能更快。但是由于要搜索的项目数量更多(比如10个特定型号),临时设置和包含的
应该更快。不会有其他短路解决方案;如果需要,则必须坚持当前的方法。不过:而不是。过滤器(…).findFirst().isPresent()
,您应该只写.anyMatch(…)
@LouisWasserman关于anyMatch()的好观点。我走了更长的路,因为我正在尝试各种额外的技巧。对于这样一项简单的任务,你可能不应该使用流
,尤其是对于1000万辆汽车。为什么不维护一个你已经拥有的汽车类型集
,然后在需要检查是否存在类型时调用集#contains
?你可以躲闪通过手动迭代所有汽车进行大量迭代,因为您不需要对迭代所有元素的Stream#filter
进行完全过滤:如果reportElements
有1000万条条目,而Honda
和Civic
占据了前两个索引,那么您就浪费了大量时间来过滤这些条目e rest.我用过汽车,但很可能是人。我只是觉得从性能上看汽车更容易。无论哪种方式,你仍然需要循环浏览数百万辆汽车的整个列表,才能在第一时间创建场景,所以你仍然在运行O(n)如果您创建了一个预设。而且,如果列表依赖于某个查询,则可能无法维护汽车的缓存集。这是一个更好的例子;)@VinceEmigh True,但我选择的答案实际上会缩短搜索时间,因此在找到我想要的前两个项目时,搜索就会停止。而且它对内存的要求也很低。因此,在不维护O(n)集的情况下,这是可能的;)这些操作是流api不想做的吗?它不修改任何数据,是一个兼容的lambda表达式。
boolean hasCivic = reportElements.stream()
.filter(car -> "Civic".equals(car.getModel()))
.findFirst()
.isPresent();
boolean hasFocus = reportElements.stream()
.filter(car -> "Focus".equals(car.getModel()))
.findFirst()
.isPresent();
return hasCivic && hasFocus;
reportElements.stream()
.filter(car -> "Civic".equals(car.getModel()) || "Focus".equals(car.getModel()))
.collect(Collectors.toMap(
c -> c.getModel(),
c -> c,
(c1, c2) -> c1
)).size() == 2;
reportElements.stream()
.filter(car -> "Civic".equals(car.getModel()) || "Focus".equals(car.getModel()))
.map(car -> car.getModel())
.collect(Collectors.toSet())
.size() == 2;
reportElements.stream()
.filter(car -> "Civic".equals(car.getModel()) || "Focus".equals(car.getModel()))
.map(car -> car.getModel())
.distinct()
.count() == 2L;
Set<String> models = reportElements.stream()
.map(Car::getModel)
.filter(model -> model.equals("Focus") || model.equals("Civic"))
.collect(Collectors.toSet());
return models.contains("Focus") && models.contains("Civic");
return reportElements.stream()
.map(Car::getModel)
.filter(model -> model.equals("Focus") || model.equals("Civic"))
.distinct()
.limit(2)
.count() == 2;
.map(Car::getModel)
.filter(model -> model.equals("Focus") || model.equals("Civic"))
.distinct()
.limit(2)
.count() == 2;
boolean matched = IntStream.iterate(1, i -> i + 1)
.mapToObj(i -> i % 3 == 0 ? "Civic" : i % 7 == 0 ? "Focus" : "Model "+i)
.peek(System.out::println)
.filter(model -> model.equals("Civic") || model.equals("Focus"))
.peek(model -> System.out.println(" After filter: " + model))
.distinct()
.peek(model -> System.out.println(" After distinct: " + model))
.limit(2)
.peek(model -> System.out.println(" After limit: " + model))
.count() == 2;
System.out.println("Matched = "+matched);
Model 1
Model 2
Civic
After filter: Civic
After distinct: Civic
After limit: Civic
Model 4
Model 5
Civic
After filter: Civic
Focus
After filter: Focus
After distinct: Focus
After limit: Focus
Matched = true
Set<String> models = Set.of("Focus", "Civic");
return reportElements.stream()
.map( Car::getModel )
.filter( models::contains )
.distinct()
.limit( models.size() )
.count() == models.size();
boolean hasFocus = false, hasCivic = false;
for (Car c : reportElements) {
if ("Focus".equals(c.getModel())) hasFocus = true;
if ("Civic".equals(c.getModel())) hasCivic = true;
if (hasFocus & hasCivic) return true;
}
return false;