从List <foo>到Map <string,列出<foo =“”>&gt;:寻找更好的实现

时间:2016-11-05 13:19:14

标签: java java-8 guava java-stream lambdaj

让我告诉你我的代码:

Class Foo

getFooMultiMapCode()

主要方法(专注于public class FooMain { public static void main(String[] args) { Foo foo1 = new Foo("100","foo1"); Foo foo2 = new Foo("200","foo2"); Foo foo3 = new Foo("300","foo3"); Foo foo4 = new Foo("100","foo4"); Foo foo5 = new Foo("100","foo5"); Foo foo6 = new Foo("200","foo6"); List<Foo> foos = Arrays.asList(foo1,foo2,foo3,foo4,foo5,foo6); Map<String,List<Foo>> fooCodeMap = getFooMultiMapCode(foos); System.out.println(fooCodeMap); } private static Map<String, List<Foo>> getFooMultiMapCode(List<Foo> foos) { Map<String, List<Foo>> fooMultiMapCode = new HashMap<String, List<Foo>>(); for(Foo foo:foos){ List<Foo> list = fooMultiMapCode.get(foo.getCode()); if(list==null){ list = new ArrayList<Foo>(); list.add(foo); fooMultiMapCode.put(foo.getCode(), list); } else { list.add(foo); } } return fooMultiMapCode; } } 方法):

{100=[foo1, foo4, foo5], 200=[foo2, foo6], 300=[foo3]}

Main正确打印此字符串:

getFooMultiMapCode

我想以更简洁的方式重写org.company.application.domain方法,例如使用java8或者像lambdaj,guava等库,但我不想更改方法签名

2 个答案:

答案 0 :(得分:11)

使用Java 8和groupingBy(classifier, downstream)的解决方案:

return foos.stream().collect(Collectors.groupingBy(Foo::getCode, Collectors.toList()));

或者只是groupingBy(classifier)注意到@Boris the Spider

return foos.stream().collect(Collectors.groupingBy(Foo::getCode));

答案 1 :(得分:1)

在@Holgers注释上展开一点评论:非流版本如果您更喜欢循环 - 仍然是std::vector,但是:

Book

甚至

java8

我仍然喜欢流版本。