我正在尝试将下面的代码转换为Java 8(使用streams),但不确定如何使用streams同时迭代通过2个列表。
public class ComparisonString {
private static List<String> input;
public static void main(String[] args) {
input = Arrays.asList("TRUE","FALSE","TRUE","N/A");
ComparisonString cs = new ComparisonString();
System.out.println(cs.getMatchedOutput(Arrays.asList("TRUE","N/A","N/A","FALSE")));
}
/**
* Check whether the 'input' List and the 'givenInput' List match.
* If a value is "N/A" in either lists then it means does-not-matter/don't-check-for-a-match-and-go-next
* @param givenInput
* @return
*/
public Optional<String> getMatchedOutput(final List<String> givenInput) {
boolean flag = true;
for (int i = 0; i < givenInput.size(); i++) {
if (this.input.get(i) != null
&& !(this.input.get(i).equalsIgnoreCase("N/A")
|| givenInput.get(i).equalsIgnoreCase("N/A"))
&& !this.input.get(i).equalsIgnoreCase(givenInput.get(i))) {
flag = false;
break;
}
}
if (flag) {
return Optional.of("flag = true");
} else {
return Optional.empty();
}
}
}发布于 2021-01-08 06:35:29
可以使用IntStream为两个列表生成索引流,然后过滤掉不相关的列表值并匹配剩余的值:
public Optional<String> getMatchedOutput(final List<String> givenInput) {
return IntStream.range(0, givenInput.size())
.filter(i -> null != input.get(i) && null != givenInput.get(i))
.filter(i -> !"N/A".equalsIgnoreCase(input.get(i)) && !"N/A".equalsIgnoreCase(givenInput.get(i)))
.allMatch(i -> input.get(i).equalsIgnoreCase(givenInput.get(i)))
? Optional.of("flag = true")
: Optional.empty();
}对已知数据进行测试:
input = Arrays.asList("TRUE","FALSE","TRUE","N/A");
ComparisonString cs = new ComparisonString();
System.out.println(cs.getMatchedOutput(Arrays.asList("TRUE","N/A","N/A","FALSE")));打印:
Optional[flag = true]发布于 2021-01-08 08:02:42
你做这件事的方式并没有错,streams在这方面做得太过分了,而且效率可能会更低。不过,我会提出两点建议:
return Optional.empty()。否则,在for循环后返回return Optional.of("flag = true")。List大小是否不相等。如果您为循环选择较长的一个,它可能会抛出异常。您可以采用两种大小的Math.min,忽略比较中的额外元素,或者只检查列表大小是否相等,并确定这对于应用程序的列表相等意味着什么。发布于 2021-01-08 06:33:28
不幸的是,你不能使用一个流同时操作两个列表。你能做的就是使用迭代器。我试着写了一些代码,它应该是这样的:
public static void streamTest(List<String> givenList) {
List<String> testing = new ArrayList<>();
IntStream.range(0, givenList.size())
.parallel()
.forEach(i -> {
if (input.get(i) != null
&& !(input.get(i).equalsIgnoreCase("N/A")
|| givenList.get(i).equalsIgnoreCase("N/A"))
&& !input.get(i).equalsIgnoreCase(givenList.get(i)))
testing.add("false");
});
if (testing.isEmpty())
System.out.println("flag = true");
else
System.out.println("flag = false");
}我希望这对你有所帮助,并给你一个开始。
https://stackoverflow.com/questions/65620462
复制相似问题