草庐IT

Collectors

全部标签

Java 8 Streams - 对元组流进行分组

编辑::我正在改写问题以便更清楚这段代码是我写的List>list=newArrayList>();list.add(newImmutablePair(1,1));list.add(newImmutablePair(1,1));list.add(newImmutablePair(1,1));list.add(newImmutablePair(2,2));list.add(newImmutablePair(2,2));list.add(newImmutablePair(2,2));list.add(newImmutablePair(3,3));list.add(newImmutableP

java.util.stream.Collectors : Why is the summingInt implemented with an array?

标准收集器summingInt在内部创建一个长度为1的数组:publicstaticCollectorsummingInt(ToIntFunctionmapper){returnnewCollectorImpl(()->newint[1],(a,t)->{a[0]+=mapper.applyAsInt(t);},(a,b)->{a[0]+=b[0];returna;},a->a[0],CH_NOID);}我想知道是否可以只定义:privateCollectorsummingInt(ToIntFunctionmapper){returnCollector.of(()->0,(a,t)->

Java 8 Lambda Collectors.summingLong 多列?

我的POJO定义如下:classEmployeeDetails{privateStringdeptName;privateDoublesalary;privateDoublebonus;...}目前,我有GroupBy'deptName'的lambda表达式:$set.stream().collect(Collectors.groupingBy(EmployeeDetails::getDeptName,Collectors.summingLong(EmployeeDetails::getSalary));问题是否可以对不止一列进行求和?我需要在一个表达式中而不是多次计算两个字段薪水和奖

java - 如何将 for-each 循环重写为流?

我有一个名为“Book”的数据结构,它包含以下字段:publicfinalclassBook{privatefinalStringtitle;privatefinalBookTypebookType;privatefinalListauthors;}我的目标是派生一个Map>来自List使用流API。为了实现它,首先,我做了一个for-each循环来阐明解决方案的步骤,然后我将它重写为基于流的方法,一步一步:Map>authorListBookType=newHashMap();books.stream().forEach(b->b.getAuthors().stream().forE

Java:groupingBy子值作为值

比方说,我有一个对象Person,其字段类型为FirstName和LastName。现在我还有一个List我喜欢使用流。现在我想生成一个Map>为了将具有相同名字的人分组。如何在不编写太多代码的情况下解决这个问题?到目前为止我的方法是personList.stream().collect(Collectors.groupingBy(Person::getFirstName,person->person.getLastName()//thisseemstobewrong));但似乎这是分配map值的错误方法。我应该改变什么?或者我应该将.reduce与newHashMap>()一起使用吗

java - Collectors.toSet() 是否总是返回 HashSet ?什么是契约(Contract)?

Javadoc说ReturnsaCollectorthataccumulatestheinputelementsintoanewSet.Therearenoguaranteesonthetype,mutability,serializability,orthread-safetyoftheSetreturned;ifmorecontroloverthereturnedSetisrequired,usetoCollection(java.util.function.Supplier).所以Collectors.toCollection(HashSet::new)似乎是避免这里出现问题的好

java - 使用流收集时 jdk8 与 jdk11 的不同行为

介绍我确实对jdk11(及更高版本)在流和收集方法方面的行为有疑问。我确实想获取流式传输资源的参数化容器的值,并在最后使用.collect(Collectors.toSet())收集这些值.问题描述当我用jdk8编译我的代码时它工作得很好。但是作为我们还要支持jdk11,我运行了编译但失败了,因为Error:(136,17)java:incompatibletypes:java.lang.Objectcannotbeconvertedtojava.util.Set(同样适用于openJdk11)用例想象一下下面的情况。我有一个基本上是数据容器的类。此容器可以包含单个值或值列表。在我的应

java - 并行转换流时如何使用收集器

我实际上试图回答这个问题HowtoskipevenlinesofaStreamobtainedfromtheFiles.lines.所以我认为这个收集器不能很好地并行工作:privatestaticCollector>oddLines(){int[]counter={1};returnCollector.of(ArrayList::new,(l,line)->{if(counter[0]%2==1)l.add(line);counter[0]++;},(l1,l2)->{l1.addAll(l2);returnl1;});}但它有效。编辑:它实际上没有用;我被我的输入集太小而无法触发任

java - 比较 Collectors.summingLong 和 Collectors.counting 的性能

基准测试在intelcorei5,Ubuntu下运行javaversion"1.8.0_144"Java(TM)SERuntimeEnvironment(build1.8.0_144-b01)JavaHotSpot(TM)64-BitServerVM(build25.144-b01,mixedmode)我正在比较Collectors.counting和Collectors.summingLong(x->1L)的性能。这是基准:publicListints=newArrayList();Collectorcounting=Collectors.counting();Collectorsu

java - 如何使用流覆盖重复创建 HashMap?

我正在创建一个HashMap使用java8streamAPI如下:Mapmap=dao.findAll().stream().collect(Collectors.toMap(Entity::getType,Entity::getValue));现在如果一个元素被添加到键已经存在的集合中,我只想保留列表中的现有元素并跳过附加元素。我怎样才能做到这一点?可能我必须使用BinaryOperation的toMap(),但任何人都可以提供我的具体案例的例子? 最佳答案 是的,您需要BinaryOperation并将其用作Collectors