Java 8:groupingBy与关联对象的属性?[循环推断]

day*_*mer 0 java intellij-idea java-8

这是我的Test样子:

@Test
    public void testFunctional() 
    {
        final Member member = new Member("email", "memberExternalId", "clientId", "clientSecret");
        final Category foodCategory = new Category("Groceries", "Food");
        final Category utilityCategory = new Category("Internet", "utility");

        final List<Transaction> transactions = new ArrayList<>();
        {
            transactions.add(new Transaction("food1", new BigDecimal("10.00"), true, LocalDateTime.now(), member, foodCategory));
            transactions.add(new Transaction("food2", new BigDecimal("20.00"), true, LocalDateTime.now(), member, foodCategory));
        }
        {
            transactions.add(new Transaction("utility1", new BigDecimal("100.00"), true, LocalDateTime.now(), member, utilityCategory));
            transactions.add(new Transaction("utility2", new BigDecimal("200.00"), true, LocalDateTime.now(), member, utilityCategory));
        }

        final Map<String, List<BigDecimal>> groupByCategory = transactions.stream().collect(Collectors.groupingBy(Category::getGroupName));
    }
Run Code Online (Sandbox Code Playgroud)

Category 看起来像这样:

public class Category 
{
    @Id
    private String id;

    @Column(nullable = false)
    private String name;

    @Column(name = "group_name", nullable = false)
    private String groupName;

    @Column(name = "created_at")
    private LocalDateTime createdAt;
...
}
Run Code Online (Sandbox Code Playgroud)

当我做:

final Map<String, List<BigDecimal>> groupByCategory = transactions.stream().collect(Collectors.groupingBy(Category::getGroupName));
Run Code Online (Sandbox Code Playgroud)

IntelliJ抱怨 Cyclic Inference

我是Java 8第一次尝试这个功能,不知道是什么导致了这个.

在此输入图像描述

Era*_*ran 5

您的输入是a List<Transaction>,您可以从中创建Stream<Transaction>.当您将其收集Stream到a中时Map,您应该提供一个收集器,该收集器将每个收集器映射Transaction到应该对其进行分组的密钥.

你想组Transaction由S GroupNameCategoryTransaction.由于Category::getGroupName不是方法Transaction,您不能在此处使用方法引用.相反,您可以使用lambda表达式:

final Map<String, List<Transaction>> groupByCategory = 
    transactions.stream()
                .collect(Collectors.groupingBy(t -> t.getCategory().getGroupName()));
Run Code Online (Sandbox Code Playgroud)

还要注意,这种分组会产生一个Map<String, List<Transaction>>,而不是Map<String, List<BigDecimal>>.