Dee*_*Das 1 java null loops list arraylist
我有一个值列表,最多包含四个元素。我需要循环遍历列表,并且仅在某些情况下才需要抛出异常。需要抛出异常的不同场景如下。
List<String> values = ["test1","test2",null,"test4"];
List<String> values = ["test1",null,"test3","test4"];
List<String> values = ["test1",null,null,"test4"];
Run Code Online (Sandbox Code Playgroud)
List<String> values = [null,"test2","test3","test4"];
List<String> values = [null,null,"test3","test4"];
List<String> values = [null,null,null,"test4"];
Run Code Online (Sandbox Code Playgroud)
所有其他情况都是有效的,不应引发异常。有效案例有:
List<String> values = ["test1","test2","test3","test4"];
List<String> values = ["test1","test2","test3",null];
List<String> values = ["test1","test2",null,null];
List<String> values = ["test1",null,null,null];
List<String> values = [null,null,null,null];
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
您应该确保 null 后面不存在非 null 元素。否则,你会抛出异常
boolean nullSeen = false;
for (String s : list) {
if (s == null) {
nullSeen = true;
} else if (nullSeen) { // for a non-null string
throw new RuntimeException("Non-null value followed a null");
}
}
Run Code Online (Sandbox Code Playgroud)
对于每个元素,我们检查它是否为空,如果是,我们设置布尔标志nullSeen。nullSeen如果我们遇到一个已经设置为true的非空字符串,我们会抛出异常。
如果您使用 Java 9+ 并且更喜欢基于流的解决方案,那么我们可以使用dropWhile方法。
boolean noNonNullValueAfterNull = list.stream()
.dropWhile(Objects::nonNull) //dropWhile(s -> s != null)
.allMatch(Objects::isNull); //allMatch(s -> s == null)
if (!noNonNullValueAfterNull) {
throw new RuntimeException("Non-null value followed a null");
}
Run Code Online (Sandbox Code Playgroud)
从列表中创建的流中,它会删除元素的前缀,直到看到null。流中的其余元素必须为null才能使返回值为true。
注意:对于空流(全部为空),它将返回true,这也是我们想要的。