Tag: collectors

被Java8 Collectors.toMap困惑

我有一个看起来像下面的集合,我想过滤掉除了几个月末的日期之外的所有内容。 2010-01-01=2100.00, 2010-01-31=2108.74, 2010-02-01=2208.74, 2010-02-28=2217.92, 2010-03-01=2317.92, 2010-03-31=2327.57, 2010-04-01=2427.57, 2010-04-30=2437.67, 2010-05-01=2537.67, 2010-05-31=2548.22, 2010-06-01=2648.22, 2010-06-30=2659.24, 2010-07-01=2759.24, 2010-07-31=2770.72, 2010-08-01=2870.72, 2010-08-31=2882.66, 2010-09-01=2982.66, 2010-09-30=2995.07, 2010-10-01=3095.07, 2010-10-31=3107.94, 2010-11-01=3207.94, 2010-11-30=3221.29 我有以下过滤条件。 frequency.getEnd返回与给定LocalDate的月末匹配的LocalDate 。 .filter(p -> frequency.getEnd(p.getKey()) == p.getKey()) 所以现在我想我必须将这个过滤后的流转换回地图。 而且我认为我使用collections家来做到这一点。 因此我补充说: .collect(Collectors.toMap(/* HUH? */)); 但我不知道如何处理Collectors.toMap 。 阅读的例子让我很困惑。 这是我当前的代码,显然不起作用。 TreeMap values = values.entrySet() .stream() .filter(p -> frequency.getEnd(p.getKey()) == p.getKey()) .collect(Collectors.toMap(/* HUH? */));

Java 8 Streams:为什么Collectors.toMap对于带有通配符的generics有不同的行为?

假设您有一个数字List 。 List的值可以是Integer , Double等类型。当您声明这样的List ,可以使用通配符( ? )或不使用通配符来声明它。 final List numberList = Arrays.asList(1, 2, 3D); final List wildcardList = Arrays.asList(1, 2, 3D); 所以,现在我想stream传输List并使用Collectors.toMap collect它全部collect到Map (显然下面的代码只是一个例子来说明问题)。 让我们开始流式传输numberList : final List numberList = Arrays.asList(1, 2, 3D, 4D); numberList.stream().collect(Collectors.toMap( // Here I can invoke “number.intValue()” – the object (“number”) is treated as a Number number -> Integer.valueOf(number.intValue()), number […]

为什么Collectors.toMap在重复键错误上报告值而不是键?

这真是一个关于细微问题的问题,但我的印象是在这里弄错了。 如果使用Collectors.toMap-method添加重复键,则会抛出带有“重复键”消息的exception。 为什么报告的价值而不是关键? 甚至两个? 这真是误导,不是吗? 这是一个certificate行为的小测试: import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class TestToMap { public static void main(String[] args) { List list = Arrays.asList( new Something(“key1”, “value1”), new Something(“key2”, “value2”), new Something(“key3”, “value3a”), new Something(“key3”, “value3b”)); Map map = list.stream().collect(Collectors.toMap(o -> o.key, o -> o.value)); System.out.println(map); } private static class Something […]

如何使用流外部的值使用Java流API创建映射?

我想初始化一个Map并希望始终从流外部添加相同的BigDecimal值。 BigDecimal samePrice; Set set; set.stream().collect(Collectors.toMap(Function.identity(), samePrice)); 但是Java抱怨如下: 收集器类型中的Map(Function,Function)方法不适用于参数(Function,BigDecimal) 为什么我不能从外面使用BigDecimal? 如果我写: set.stream().collect(Collectors.toMap(Function.identity(), new BigDecimal())); 它会起作用,但那当然不是我想要的。

如何使用java 8 stream和lambda来flatMap一个groupingBy结果

我有一个包含其他对象列表的对象,我想返回由容器的某些属性映射的包含对象的平面图。 任何一个如果可能只使用流和lambdas? public class Selling{ String clientName; double total; List products; } public class Product{ String name; String value; } 让我们来处理一系列操作: List operations = new ArrayList(); operations.stream() .filter(s -> s.getTotal > 10) .collect(groupingBy(Selling::getClientName, mapping(Selling::getProducts, toList()); 结果将是善意的 Map<String, List<List>> 但我想像它一样扁平化 Map<String, List>

Java 8 Streams:根据不同的属性多次映射同一个对象

我的同事向我提出了一个有趣的问题,我无法找到一个整洁而漂亮的Java 8解决方案。 问题是流过POJO列表,然后根据多个属性在地图中收集它们 – 映射导致POJO多次出现 想象一下以下POJO: private static class Customer { public String first; public String last; public Customer(String first, String last) { this.first = first; this.last = last; } public String toString() { return “Customer(” + first + ” ” + last + “)”; } } 将其设置为List : // The list of customers List […]

使用自定义收集器进行Java 8分组?

我有以下课程。 class Person { String name; LocalDate birthday; Sex gender; String emailAddress; public int getAge() { return birthday.until(IsoChronology.INSTANCE.dateNow()).getYears(); } public String getName() { return name; } } 我希望能够按年龄分组,然后收集人名列表而不是Person对象本身; 所有这些都在一个很好的lamba表达式中。 为了简化所有这些,我将链接我当前的解决方案,该解决方案按年龄存储分组结果,然后迭代它以收集名称。 ArrayList members = new ArrayList(); members.add(new OtherPerson(“Fred”, IsoChronology.INSTANCE.date(1980, 6, 20), OtherPerson.Sex.MALE, “fred@example.com”)); members.add(new OtherPerson(“Jane”, IsoChronology.INSTANCE.date(1990, 7, 15), OtherPerson.Sex.FEMALE, “jane@example.com”)); members.add(new OtherPerson(“Mark”, IsoChronology.INSTANCE.date(1990, 7, 15), OtherPerson.Sex.MALE, […]