我有一个对象列表:
List<Object[]> list = new ArrayList<>();
Object[] object = {"test", "test1", "test2"};
list.add(object);
列表包含一些数据。
我有另一个字符串String str = "test";
我正在使用下面的代码。最好的其他方法是什么:
for (Object []object1 : list) {
for (Object obj : object1) {
if (obj.equals("test")) {
System.out.println("true");
}
}
}
如何使用最少的代码检查上面列表中的此字符串。
答案 0 :(得分:2)
Java 8引入了Streams,它们功能强大,而且代码紧凑,正如您所要求的那样。这个答案使用Java 8的更多功能,如Lambdas和Method References。
这是一条单线指令:
boolean containsObject = list.stream().flatMap(Arrays::stream).filter(s->str.equals(s) ).findFirst().isPresent();
这是如何运作的:
boolean containsObject = list.stream() // Turning the List into a Stream of Arrays
.flatMap(Arrays::stream) // flattening the 2D structure into a single-dimensional stream of Objects (Note: using a Method reference)
.filter(s->str.equals(s)) // Filtering the flat stream to check for equality (Note: using a Lambda expression)
.findFirst() // Demands to find the first Occurence that passed the Filter test
.isPresent(); // Collapse the stream and returns the result of the above demand (Note: the Stream makes no computation until this instruction)
这个解决方案代码紧凑,带来Streams的优点,例如并行化和懒惰。
答案 1 :(得分:0)
如果您将Object[]
转换为列表,则可以调用contains(Object)
。您可以将list
设为List<List<Object>>
,也可以将其保留为Object[]
,并根据需要将Object[]
包装在List
中。
“根据需要转换”的示例:
for(Object[] object1 : list)
if(Arrays.asList(object1).contains("test"))
System.out.println("true");
就个人而言,我会list
成为List<List>
。无论何时添加它,只需将数组包装在列表中。假设arr
是Object[]
,则表示list.add(Arrays.asList(arr));
。
亚历山大的答案也是正确的(我认为;我没有仔细研究它),但我发现长串的流操作符不太可读。如果您不同意我对此的看法,请使用流操作符。