使用 Lambda 从列表中删除小组成标识符

问题描述 投票:0回答:1

我需要从列表中删除特定 ID。

为了更好地解释自己,我有一个

Document
列表,其中包含复合
String
,它们是标识符。这些标识符由一对用“-”分隔的
Integers
组成。

这个想法是从标识符列表中删除所有包含

String
相同第一部分的标识符,并仅保留其中最大的一个。也就是说,如果我有一个
Document
列表,输出如下:

"documentId": "521-1"
"documentId": "521-2"
"documentId": "32-2"
"documentId": "112-6"
"documentId": "112-11"
"documentId": "112-2"

结果应该是:

"documentId": "521-2"
"documentId": "112-11"
"documentId": "32-2"

我尝试过用流来做到这一点,但我没有找到方法。我浏览了列表,但由于它们是复合标识符,我不知道如何进行比较,也不知道如何保留其中最小的一个。

我的伪代码,不起作用:

    object.getDocuments().stream().reduce((a, b)->{                     
if(a.getFirstPart().equals(b.getFirstPart())){
        //Then I should remove the small secondPart                 
    } return b;});
java spring-boot lambda java-stream
1个回答
2
投票

这是一种方法。请注意,它对无效数据并不稳健。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {

        String[] ids = {"521-1",
                "521-2",
                "32-2",
                "112-6",
                "112-11",
                "112-2"
        };
        List<String> result = Arrays.stream(ids).collect(Collectors.toMap(
                s -> s.split("-")[0], s -> Integer.parseInt(s.split("-")[1]), Math::max
        )).entrySet().stream().map(e -> e.getKey() + "-" + e.getValue()).collect(Collectors.toList());
        System.out.println(result);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.