3 回答
TA贡献1797条经验 获得超4个赞
我们可以使用以下语法来做到这一点:
MyObject findFirst = Arrays.stream(array).flatMap(Arrays::stream) .collect(Collectors.toList()) .subList(0, 3) // observe this line .stream() .filter(e -> e != null).findFirst().orElse(null);
这里我们将二维数组转换为一个list
using flatMap
,然后用 usesubList
来指定要搜索的索引的开始和结束。
要指定范围,您需要将值传递给 subList(...)
TA贡献1909条经验 获得超7个赞
虽然 Nicholas K 的答案适用于水平切片,但它不适用于垂直切片。这是一个完全符合OP想要的答案。为了清楚起见,我已经编写了传统的(使用 for 循环)方式来执行此操作,以确认这就是 OP 打算完成的操作。然后,我使用流完成了它。它适用于水平和垂直切片。
public static void main(String[] args) {
// Sample data
Object[][] array = new Object[5][10];
array[1][5] = "this is it"; // This is the first non-null object
array[4][7] = "wrong one"; // This is another non-null object but not the first one
// Define range (start=inclusive, end=exclusive)
int iStart = 0, iEnd = array.length, jStart = 3, jEnd = 9; // array[irrelevant][3-9]
//int iStart = 1, iEnd = 3, jStart = 0, jEnd = array[0].length; // array[1-3][irrelevant]
// Doing it the traditional way
Object firstNonNull = null;
outerLoop:
for (int i = iStart; i < iEnd; i++)
for (int j = jStart; j < jEnd; j++)
if (array[i][j] != null) {
firstNonNull = array[i][j];
break outerLoop;
}
assert firstNonNull != null;
assert firstNonNull.equals("this is it");
// Doing it with Java 8 Streams
firstNonNull = Arrays.asList(array)
.subList(iStart, iEnd)
.stream()
.flatMap(row -> Arrays.asList(row)
.subList(jStart, jEnd)
.stream()
.filter(Objects::nonNull))
.findFirst()
.orElse(null);
assert firstNonNull != null;
assert firstNonNull.equals("this is it");
}
TA贡献1827条经验 获得超4个赞
MyObject obj = Arrays.stream(array) .flatMap(Arrays::stream) .filter(Objects::nonNull) .findFirst() .orElse(null);
添加回答
举报