我有一个 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?方法,以及如何使用?
我有一个 Object[] array
我需要创建map Map<Obejct, Integer>,其中Integervalue包含数组中关键Object的频率.
我怎么能用java 8风格,用Collectors?
想象一下,我有一个像这样的文件:
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>>
或者也许有更好的方法来做到这一点?
实现以下目标的最佳,最便宜,最佳性能的方法是什么:
我有一个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无论如何解开?
我想对一个集合进行分组,但我不希望聚合包含一些值.这样做的最佳解决方案是什么?
解决方案可能是收集器,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) 在这个例子中
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>因此它不工作.我应该怎么做才能回到地图Boolean和List<Integer>呢?
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) 我有两个简单的类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)
这不是一个优雅的解决方案 …
我正在实现使用合并功能的自己的收集器.不幸的是,对于我的一些情况,我不能重用抛出IllegalStateException的以下JDK合并函数.
java.util.stream.Collectors#throwingMerger
Run Code Online (Sandbox Code Playgroud)
它发生的原因是它具有私有访问修饰符,并且来自其他(非内部)类的访问受到限制.但是,javadoc说:
这可以用于强制假设所收集的元素是不同的
但是,正如我所见,java doc已经过时了.它不能使用.问题是JDK是否为java开发人员提供类似功能(类似方法,常量等),或者应该自己编写?
我有一个语言列表,例如英语,法语等。我也有一个单词列表,例如苹果,橘子等。对于每个单词,我想创建一个如下图的地图:
地图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中。我怎样才能做到这一点?
collectors ×10
java ×8
java-8 ×8
java-stream ×8
lambda ×2
arrays ×1
collect ×1
collections ×1
dictionary ×1
object ×1
optional ×1
predicates ×1