从数组中过滤多个值

Filter multiple values from arrays

我有旧的 Java 代码如下:

String str1 = "aaa,bbb,ccc,ddd,eee,fff,ggg";
String str2 = "111,222,333,444,555,666,777";

//Start
String[] str1Array = str1.split(",", -1);
String[] str2Array = str2.split(",", -1);

HashMap<String, String> someMap = new HashMap<String, String>();

if (str1Array.length == str2Array.length) {
    for (int i = 0; i < str1Array.length; i++) {
        if (str1Array[i].equalsIgnoreCase("bbb") || str1Array[i].equalsIgnoreCase("ddd") || str1Array[i].equalsIgnoreCase("ggg")) {
            System.out.println("Processing:" + str1Array[i] + "-" + str2Array[i]);
            someMap.put(str1Array[i], str2Array[i]);
        }
    }
}


for (Map.Entry<String, String> entry : someMap.entrySet()) {
    System.out.println(someProcessMethod1(entry.getKey()) + " : " + someProcessMethod2(entry.getValue()));

}
//Finish

我正在尝试使用Java8(我还在学习),并尝试过滤和处理过滤后的值。这里需要一些指点。

我从这里开始(我知道错了):

String[] mixAndFilter = (String[]) Stream.concat(Stream.of(str1Array), Stream.of(str2Array)).filter(???????).thenWhatHere() 
                .toArray(b -> new String[b]);

        for (String b : mixAndFilter) {
            System.out.println(mapkey : mapValue);
        }

我应该在这里做什么来过滤这三个字符串并在我的 someProcessMethods 中使用它们,就像以前的方法一样?如果可能的话,有没有办法以 Java 8 种方式完成从 StartFinish 的事情?欢迎任何 pointers/solution/pseudo-code。

更新(根据WJS的要求):

目标是:

从第一个数组中过滤 bbb, ddd, ggg 个字符串,然后将它们与第二个数组中的相应值映射。这样预期的输出是:

bbb : 222
ddd : 444
ggg : 777

使用流的最简单方法是:

  • 设置一组字符串用作过滤器列表
  • 首先像您一样拆分字符串。
  • 为数组生成一系列索引。
  • 然后,如果集合中包含索引 i 处的字符串,则将该索引传递给过滤器。
  • 使用索引填充地图
String str1 = "aaa,bbb,ccc,ddd,eee,fff,ggg";
String str2 = "111,222,333,444,555,666,777";
Set<String> filterList = Set.of("bbb", "ddd", "ggg");

String[] str1Array = str1.split(",", -1);
String[] str2Array = str2.split(",", -1);

Map<String, String> someMap = IntStream
        .range(0, str1Array.length).boxed()
        .filter(i -> filterList.contains(str1Array[i]))
        .collect(Collectors.toMap(i -> str1Array[i],
                i -> str2Array[i]));


someMap.entrySet().forEach(System.out::println);

打印

bbb=222
ddd=444
ggg=777

可以将字符串拆分作为流处理的一部分。但是我发现做起来比较麻烦。