标签: collectors

如何在 Java8 中将 List<Map<String,Object>> 分组为 Map<String,List<Map<String,Object>>

我有一个 List<Map<String,Object>>

[ {key1: object1a, key2: object2a, key3: object3a}, 
  {key1: object1a, key2: object2a, key3: object3a}, 
  {key1: object1b, key2: object2b, key3: object3b}, 
  {key1: object1b, key2: object2b, key3: object3b}, 
  ...
]
Run Code Online (Sandbox Code Playgroud)

我想按第三个值对其进行分组,以获得一个Map<String,List<Map<String,Object>>>

{ object3a: [ {key1: object1a, key2: object2a}, 
              {key1: object1a, key2: object2a}
            ],
  object3b: [ {key1: object1b, key2: object2b}, 
              {key1: object1b, key2: object2b}
            ],
  ...
}
Run Code Online (Sandbox Code Playgroud)

是否可以使用该Collectors.groupingBy?方法,以及如何使用?

java java-8 java-stream collectors

3
推荐指数
1
解决办法
1872
查看次数

Java 8频率对象在数组中

我有一个 Object[] array

我需要创建map Map<Obejct, Integer>,其中Integervalue包含数组中关键Object的频率.

我怎么能用java 8风格,用Collectors

arrays dictionary object java-8 collectors

3
推荐指数
1
解决办法
1004
查看次数

使用Collectors和java 8的简单示例

想象一下,我有一个像这样的文件:

1, Apple
1, Pear
1, Orange
2, Apple
3, Melon
3, Orange
Run Code Online (Sandbox Code Playgroud)

我想把它解析成一个列表,每个条目都是一个地图,或者我猜它可能是我自己的对象,但我认为一张地图最好,因为它是一把钥匙.值.

我在努力:

private List<Map<String, String>> readRecords(String path) {
    return Files.lines(Paths.get(path))
            .map(line -> Arrays.asList(line.split(SEPARATOR)))
            .map(snippets -> new HashMap<Integer, String>().put(Integer.parseInt(snippets.get(0)), snippets.get(1)))
            .collect(Collectors.toList());
}  
Run Code Online (Sandbox Code Playgroud)

但这给了我一个关于无法在List<String>和之间转换的错误List<Map<String, String>>

或者也许有更好的方法来做到这一点?

java lambda java-8 java-stream collectors

3
推荐指数
1
解决办法
216
查看次数

从集合集中添加所有项目的最佳方法

实现以下目标的最佳,最便宜,最佳性能的方法是什么:

我有一个CollectionObjects myObject,它提供了一个返回一组整数的方法.我想将集合中的所有项目添加到新集合中.

LinkedList<myObject>  ll = new LinkedList<>();

    //fill the list bla bla

Set<Integer> result = ll.stream()
    .map(f -> f.getTheSet())
    .flatMap(Set::stream)
    .collect(Collectors.toCollection(TreeSet::new));

System.out.println(result.toString());
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来获得包含所有对象的所有整数的结果集?我想避免使用flatMap命令"解压缩集合" .相反,我想到的事情.addAll或者最终无关紧要,因为.addAll无论如何解开?

java collections java-8 java-stream collectors

3
推荐指数
1
解决办法
2206
查看次数

Java8,有过滤器吗?

我想对一个集合进行分组,但我不希望聚合包含一些值.这样做的最佳解决方案是什么?

解决方案可能是收集器,filtering(Predicate,Collector)但没有这样的收集器.没有实现自己的收藏家,有没有办法做到这一点?

IntStream.range(0,100).collect(
    groupingBy(
       i -> i % 3,
       HashMap::new,
       filtering( i -> i % 2 == 0, toSet() )
    )
);
Run Code Online (Sandbox Code Playgroud)

java predicates collectors

3
推荐指数
2
解决办法
1142
查看次数

从Collectors.partitioningBy返回非类类型

在这个例子中

Stream<MyClass>stream = Stream.of(new MyClass(5),new MyClass(15),new MyClass(8),new MyClass(12));

Map<Boolean, List<Integer>> map =
        stream.collect(Collectors.partitioningBy(a->a.getNum()<10));
Run Code Online (Sandbox Code Playgroud)

stream.collect检索地图布尔并List<MyClass>因此它不工作.我应该怎么做才能回到地图BooleanList<Integer>呢?

java java-8 java-stream collectors

3
推荐指数
1
解决办法
323
查看次数

使用Java8流实现此集合的最佳方法

private enum EnumVals {
        FIRST(new String[]{"a","b"}),
        SECOND(new String[]{"a","b","c","d"}),
          THIRD(new String[]{"d","e"});

        private String[] vals;

        EnumVals(String[] q) {
            vals=q;
        }

        public String[] getValues(){
            return vals;
        }
    };
Run Code Online (Sandbox Code Playgroud)

我需要的是所有EnumVals.getValues()的唯一组合列表.

String[] allVals = {"a","b","c","d","e"}
Run Code Online (Sandbox Code Playgroud)

我做了类似下面的事情,但它抛出了错误:

Stream.of(EnumVals.values()).map(w->w.getValues()).collect(Collectors.toCollection(HashSet::new)).toArray(new String[0]);
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream collectors

3
推荐指数
1
解决办法
58
查看次数

Java 8流api如何收集List to Object

我有两个简单的类ImageEntity和ImageList

如何将结果列表ImageEntity收集到ImageList?

List<File> files = listFiles();
        ImageList imageList = files.stream().map(file -> {
            return new ImageEntity(
                                   file.getName(), 
                                   file.lastModified(), 
                                   rootWebPath + "/" + file.getName());
        }).collect(toCollection(???));
Run Code Online (Sandbox Code Playgroud)

public class ImageEntity {
private String name;
private Long lastModified;
private String url;
 ...
}
Run Code Online (Sandbox Code Playgroud)

public class ImageList {
 private List<ImageEntity> list;

 public ImageList() {
    list = new ArrayList<>();
 }

 public ImageList(List<ImageEntity> list) {
    this.list = list;
 }
 public boolean add(ImageEntity entity) {
    return list.add(entity);
 }
 public void addAll(List<ImageEntity> list) {
     list.addAll(entity);
 }

}
Run Code Online (Sandbox Code Playgroud)

这不是一个优雅的解决方案 …

lambda collect java-8 java-stream collectors

3
推荐指数
1
解决办法
1万
查看次数

Java 8中throwMerger的替代方案

我正在实现使用合并功能的自己的收集器.不幸的是,对于我的一些情况,我不能重用抛出IllegalStateException的以下JDK合并函数.

java.util.stream.Collectors#throwingMerger
Run Code Online (Sandbox Code Playgroud)

它发生的原因是它具有私有访问修饰符,并且来自其他(非内部)类的访问受到限制.但是,javadoc说:

这可以用于强制假设所收集的元素是不同的

但是,正如我所见,java doc已经过时了.它不能使用.问题是JDK是否为java开发人员提供类似功能(类似方法,常量等),或者应该自己编写?

java java-8 java-stream collectors

3
推荐指数
1
解决办法
924
查看次数

仅当存在可选值时,才使用Collectors.toMap

我有一个语言列表,例如英语,法语等。我也有一个单词列表,例如苹果,橘子等。对于每个单词,我想创建一个如下图的地图:

地图map = {英语=苹果,意大利语= mela}

为了获得translationWord,我有一个返回可选函数的函数。该方法的签名如下所示:

Optional<TranslatedWord> getTranslatedWord(String word, Language language);

这是我编写的将单词收集到地图中的代码

List<Language> languages = {english, italian, french};
for(String w : words) {
   Map<Language, TranslatedWord> map = languages.stream().collect(Collectors.ToMap(language -> language,
      language -> getTranslatedWord(w, language));

   doSomethingWithThisMap(map);
}
Run Code Online (Sandbox Code Playgroud)

问题是getTranslatedWord()返回Optional。仅当可选参数中包含值时,我才需要将其收集到Map中。我怎样才能做到这一点?

java optional java-stream collectors

3
推荐指数
1
解决办法
140
查看次数