检查对象数组列表中的数据

时间:2017-03-09 16:04:31

标签: java

我有一个对象列表:

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");
        }
     }
}

如何使用最少的代码检查上面列表中的此字符串。

2 个答案:

答案 0 :(得分:2)

Java 8引入了Streams,它们功能强大,而且代码紧凑,正如您所要求的那样。这个答案使用Java 8的更多功能,如LambdasMethod 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>。无论何时添加它,只需将数组包装在列表中。假设arrObject[],则表示list.add(Arrays.asList(arr));

亚历山大的答案也是正确的(我认为;我没有仔细研究它),但我发现长串的流操作符不太可读。如果您不同意我对此的看法,请使用流操作符。