Streams java 8 Map中的对象和字符串

时间:2016-01-26 12:26:09

标签: java java-8 java-stream

我上了3节课。

  • Angestellte(只是包含一些像名字等的东西。)
  • 部门(仅包含字符串)
  • 和ttest(显然是为了测试)

我想把所有工人“Angestellte”都放进他们的部门。所以基本上输出应该是:

Personalabteilung: 4
Buchhaltung: 3 
Fertigung: 3

我正在尝试使用Department和Long将Map作为Map 但最终我想要Map with String和Long。

我也认为我的Collectors.counting()不能像我说的那样工作。

在我已经映射之后,我真的不知道如何处理我的字符串流。那就是为什么我放三个?在代码中。

import java.util.*;
import java.util.function.Supplier;
import java.util.stream.Collectors;

public class ttest {

public static void main(String[] args){

    Department d1 = new Department("Personalabteilung");
    Department d2 = new Department("Buchhaltung");
    Department d3 = new Department("Fertigung");

    List<Angestellte> AlleAng = Arrays.asList(

            new Angestellte("Sandra","Bullock",d3,3450, "Female"),
            new Angestellte("Yutta","Knie",d1,2800, "Female"),
            new Angestellte("Ludwig","Herr",d3,3850, "Male"),
            new Angestellte("Peter","Pan",d2,1850, "Male"),
            new Angestellte("Nicky","Smith",d3,2100, "Female"),
            new Angestellte("Herbert","Rotwein",d2,2450, "Male"),
            new Angestellte("Sandra","Siech",d1,1100, "Female"),
            new Angestellte("Florian","Schwarzpeter",d2,2800, "Male"),
            new Angestellte("Herrietta","Glas",d1,2100, "Female"),
            new Angestellte("Brock","Builder",d1,6000, "Male"));

Map<Department, Long> DepAnz = AlleAng.stream()
            .map(a -> a.getDep())
            .collect(Collectors.toMap(a.getDep???, Collectors.counting()));

}
}

3 个答案:

答案 0 :(得分:3)

如果你想按部门分组,你的getter被称为getDep()你可以

Map<Department, Long> DepAnz = AlleAng.stream()
            .collect(Collectors.groupingBy(a -> a.getDep(), Collectors.counting()));

答案 1 :(得分:2)

您需要使用以下组:

^((<#a#>)+|[;]|(([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})‌​+)+$

groupingBy(classifier, downstream)收集器是一个收集器,它将Stream元素收集到Map<Department, Long> DepAnz = AlleAng.stream() .collect(Collectors.groupingBy(Angestellte::getDep, Collectors.counting())); 中,其中键由分类器返回,值是将下游收集器应用于具有以下内容的所有Stream元素的结果。同等的钥匙。在这种情况下,我们想要的是计算值,以便我们使用Collectors.counting()作为下游收集器。

如果你想通过部门的名称进行分组,你可以这样做,假设getter被称为Map来检索名称:

.getName()

这将返回所有不同部门名称的计数。

答案 2 :(得分:0)

 Map<String, Long> map = AlleAng.stream().collect(Collectors.toMap(a -> a.getDept().getName(), a -> 1L, (Long acc, Long newValue) -> acc + newValue));

这是lambda的冗长用法,可以满足您的需求。 使用toMap Collector以根据您获得的实际Angestellte引用映射特定键和值。 当然,石斑鱼功能最适合,但这可以作为一些标准的地图分组的通用示例