从数组中过滤多个值
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 种方式完成从 Start
到 Finish
的事情?欢迎任何 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
可以将字符串拆分作为流处理的一部分。但是我发现做起来比较麻烦。
我有旧的 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 种方式完成从 Start
到 Finish
的事情?欢迎任何 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
可以将字符串拆分作为流处理的一部分。但是我发现做起来比较麻烦。