Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.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 Stream - Fatal编程技术网

Java 如何使用流比较两个列表并从比较列表中获取元素?

Java 如何使用流比较两个列表并从比较列表中获取元素?,java,java-stream,Java,Java Stream,您知道如何使用Java 8 Stream吗?您需要使用map而不是filter,以便将短名称映射到相应的全名 String result= nameList.stream() .filter(v -> fullNameList.stream().anyMatch(s -> s.getName().equals(v))) .collect(Collectors.joining(",")); Actual Result : "Delta,

您知道如何使用Java 8 Stream吗?

您需要使用
map
而不是
filter
,以便将短名称映射到相应的全名

String result= nameList.stream()
            .filter(v -> fullNameList.stream().anyMatch(s -> s.getName().equals(v)))
            .collect(Collectors.joining(","));

Actual Result : "Delta,Alpha"
Expected Result : "Delta Non,Alpha Maz"

这是假设
FullName
类有一个
getFullName()
方法,该方法返回您希望收集的数据。

只需对代码做一点小小的更改,就可以获得预期的输出

String result= 
    nameList.stream()
            .map(v -> fullNameList.stream()
                                  .filter(s -> s.getName().equals(v))
                                  .findFirst()
                                  .map(FullName::getFullName))
            .filter(Optional::isPresent)
            .map(Optional::get)
            .collect(Collectors.joining(","));

输出:Alpha-Maz,Delta-Non

如果将
名称列表
限制为主要,则可以使用以下选项:

String res = fullNameList.stream().filter(f -> nameList.stream().anyMatch(n -> n.equals(f.getName()))).map(f -> f.getfullName()).collect(Collectors.joining(",")); 
Map nameMapper=fullNameList.stream()
.collect(Collectors.toMap(FullName::getFirstName,FullName::getFullName));
List filteredList=nameList.stream()
.filter(名称映射器::containsKey)
.map(nameMapper::get)
.collect(Collectors.toList());
System.out.println(“nameList=“+nameList”);
System.out.println(“filteredList=“+filteredList”);
名称列表=[Indigo,Alpha,Delta] filteredList=[Indigo Loe、Alpha Maz、Delta Non]

名称列表=[Delta,Alpha] filteredList=[Delta非,Alpha Maz]

虽然创建映射会有开销,但对于实时应用程序,如果列表数量巨大,那么迭代成本会更低,因为抓取是O(1),因为字符串本身不太可能创建哈希冲突。在这种情况下,您的抓取也是O(logn)


如果列表较小,我认为Eran的回答更合适。

澄清-如果名称列表中的名字与全名列表中的名字匹配,您想将全名提取到另一个列表中吗?是的,这就是我想要的结果。如果输出顺序无关紧要,您可以将名称存储为
集合
,然后在遍历
完整名称列表
时,过滤相关名称并映射以进一步执行联接。
我必须使用名称列表作为主要对象,因为我希望结果按照名称列表中的顺序进行,与在
名称列表中对每个
名称多次处理
fullNameList
相比,对于已处理的内存中列表来说,这没有理由是昂贵的。只是您可以将其修改为使用
收集器。加入
以符合OP的要求。是的,您可以根据您的要求更改减少量
String res = fullNameList.stream().filter(f -> nameList.stream().anyMatch(n -> n.equals(f.getName()))).map(f -> f.getfullName()).collect(Collectors.joining(",")); 
String result = nameList.stream()
                .flatMap(name -> fullNameList.stream()
                        .filter(fullName -> fullName.getName().equals(name))
                        .map(FullName::getFullName)
                )
                .collect(Collectors.joining(","));
Map<String, String> nameMapper = fullNameList.stream()
                    .collect(Collectors.toMap(FullName::getFirstName, FullName::getFullName));

List<String> filteredList = nameList.stream()
                            .filter(nameMapper::containsKey)
                            .map(nameMapper::get)
                            .collect(Collectors.toList());

System.out.println("nameList = " + nameList);
System.out.println("filteredList = " + filteredList);