Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算要列表的字符串映射中的所有元素_Java_Java 8_Java Stream - Fatal编程技术网

Java 计算要列表的字符串映射中的所有元素

Java 计算要列表的字符串映射中的所有元素,java,java-8,java-stream,Java,Java 8,Java Stream,是否有更好的方法来计算地图中所有列表的大小?那么firstList.size()+secondList.size()? 我已经这样做了,但是仅仅为了计数而创建一个列表并不是一个正确的方法 public static void main(String[] args) { List<String> firstList = new ArrayList<>(); firstList.add("first"); List<String> seco

是否有更好的方法来计算地图中所有列表的大小?那么
firstList.size()+secondList.size()
? 我已经这样做了,但是仅仅为了计数而创建一个列表并不是一个正确的方法

public static void main(String[] args) {
    List<String> firstList = new ArrayList<>();
    firstList.add("first");
    List<String> secondList = new ArrayList<>();
    secondList.add("second");

    Map<String, List<String>> myMap = new HashMap<>();
    myMap.put("one", firstList);
    myMap.put("two", secondList);

    int size = myMap.entrySet().stream()
                               .map(entry -> entry.getValue())
                               .flatMap(list -> list.stream())
                               .collect(Collectors.toList())
                               .size();
    System.out.println("Size of all elements in map is:" + size);
}
publicstaticvoidmain(字符串[]args){
List firstList=新建ArrayList();
第一个列表。添加(“第一个”);
List secondList=new ArrayList();
第二个列表。添加(“第二个”);
Map myMap=newhashmap();
myMap.put(“一”,第一个列表);
myMap.put(“两个”,第二个列表);
int size=myMap.entrySet().stream()
.map(条目->条目.getValue())
.flatMap(列表->列表.stream())
.collect(收集器.toList())
.size();
System.out.println(“地图中所有元素的大小为:“+Size”);
}

这至少更具可读性

int size = myMap.values().stream()
     .mapToInt(Collection::size)
     .sum();
或者,如果您希望看起来像一个函数式编程大师,请使用:

int size2 = myMap.values().stream()
     .reduce(0, (acc, val) -> acc + val.size(), Integer::sum);
编辑:使用
.values()

:]

前面的两个答案都很好,但是如果直接使用
值()
,而不是迭代
entrySet()
,可以将答案缩短一点:

//流媒体版本
int size=myMap.values().stream()
.mapToInt(列表->列表.size())
.sum();
//标准循环版本
int size=0;
对于(列表:myMap.values())
size+=list.size();
另一种方式:

private static int size = 0;

public static void main(String[] args) {
    List<String> firstList = new ArrayList<>();
    firstList.add("first");
    List<String> secondList = new ArrayList<>();
    secondList.add("second");

    Map<String, List<String>> myMap = new HashMap<>();
    myMap.put("one", firstList);
    myMap.put("two", secondList);

    myMap.values().forEach(value -> {size += value.size();});
    System.out.println("Size of all elements in map is:" + size); 
}
private static int size=0;
公共静态void main(字符串[]args){
List firstList=新建ArrayList();
第一个列表。添加(“第一个”);
List secondList=new ArrayList();
第二个列表。添加(“第二个”);
Map myMap=newhashmap();
myMap.put(“一”,第一个列表);
myMap.put(“两个”,第二个列表);
myMap.values().forEach(value->{size+=value.size();});
System.out.println(“地图中所有元素的大小为:“+Size”);
}

让我把这个弄清楚。您想获取地图中所有列表的大小吗?所以本例中的firstList.size()+secondList().size?关闭,但为什么还要处理Map.Entry对象呢?如果你想看起来像一个函数式编程大师,为什么不干脆
myMap.values().stream().mapToInt(Collection::size).sum()
private static int size = 0;

public static void main(String[] args) {
    List<String> firstList = new ArrayList<>();
    firstList.add("first");
    List<String> secondList = new ArrayList<>();
    secondList.add("second");

    Map<String, List<String>> myMap = new HashMap<>();
    myMap.put("one", firstList);
    myMap.put("two", secondList);

    myMap.values().forEach(value -> {size += value.size();});
    System.out.println("Size of all elements in map is:" + size); 
}