gpt4 book ai didi

Java 8 lambda 表达式 : Group all items in sequence which satisfy the given predicate. 分组应将谓词作为键,将项作为值

转载 作者:行者123 更新时间:2023-11-30 03:29:58 25 4
gpt4 key购买 nike

这是示例输入数据和预期输出。我想执行这个操作在输入列表上进行单次迭代。

// input
Predicate<File> sizeP = f -> f.length() > 1_000_000; // size filter
Predicate<File> nameP = f -> f.getName().startsWith("Plot"); // name filter
List<File> fileList;
// output
// files list which satisfy the filter criteria
Map<Predicate<File>,List<File>> rulesToFiles = new HashMap<>();

// Example data
// 1. PlotPresentation.pptx-> 2 MB size
// 2. Gen.docx-> 500 KB size
// 3. Group.docx-> 1.5 MB size
// 4. PlotDetails.docx-> 850 KB size
// 5. PlotDiagram.docx-> 5 MB size

// my map should have
Map<Predicate<File>,List<File>> rulesToFiles = new HashMap<>();
// [size-predicate]-> [PlotPresentation.pptx,Group.docx,PlotDiagram.docx]
// [name-predicate]-> [PlotPresentation.pptx,PlotDetails.docx,PlotDiagram.docx]

最佳答案

为了将有用的键与谓词相关联,我们可以使用 Map :

Map<String, Predicate<File>> pred=new TreeMap<>();
pred.put("size", f -> f.length() > 1_000_000);
pred.put("name", f -> f.getName().startsWith("Plot"));

然后我们可以这样处理它们:

Map<String,List<File>> rulesToFiles = 
fileList.stream().collect(Collectors.groupingBy(f->
pred.entrySet().stream().filter(e->e.getValue().test(f))
.map(Map.Entry::getKey).collect(Collectors.joining("+"))
));

这会导致

 => [Gen.docx]
size => [Group.docx]
name => [PlotDetails.docx]
name+size => [PlotPresentation.pptx, PlotDiagram.docx]

这并不完全符合您问题中的要求,但非常有用。也许你可以接受这一点。

但是如果这不能满足您,您可以对Map进行后处理。 :

if(rulesToFiles.getClass()!=HashMap.class)// ensure mutable Map
rulesToFiles=new HashMap<>(rulesToFiles);

rulesToFiles.remove(""); // remove the none-matching items
List<File> nameAndSize = rulesToFiles.remove("name+size");// remove&check for common items
if(nameAndSize!=null) {// merge them
BinaryOperator<List<File>> merger=(a,b)->
Stream.concat(a.stream(), b.stream()).collect(Collectors.toList());
rulesToFiles.merge("size", nameAndSize, merger);
rulesToFiles.merge("name", nameAndSize, merger);
}

结果:

size => [Group.docx, PlotPresentation.pptx, PlotDiagram.docx]
name => [PlotDetails.docx, PlotPresentation.pptx, PlotDiagram.docx]
<小时/>

更新:

我想了想,这是一个生成Map的解决方案根据要求,直接通过Stream首先进行操作,因此不需要额外的操作。基于Map<String, Predicate<File>> pred第一个解决方案,使用:

Map<String,List<File>> rulesToFiles = fileList.stream()
.flatMap(f -> pred.entrySet().stream().filter(e->e.getValue().test(f))
.map(e->new AbstractMap.SimpleEntry<>(e.getKey(), f)))
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue, Collectors.toList())));

结果:

size => [PlotPresentation.pptx, Group.docx, PlotDiagram.docx]
name => [PlotPresentation.pptx, PlotDetails.docx, PlotDiagram.docx]

关于Java 8 lambda 表达式 : Group all items in sequence which satisfy the given predicate. 分组应将谓词作为键,将项作为值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29293453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com