我有一段代码:
SELECT
MAX( tbl.total ) as total,
ARRAY_TO_JSON( ARRAY_AGG( tbl.item ) ) as items
FROM (
SELECT
COUNT(*) OVER () AS total,
ROW_TO_JSON( tbl.* ) as item
FROM ( <QUERY> ) tbl
OFFSET <PAGE_SIZE>*<PAGE_NUM>
LIMIT <PAGE_SIZE>
) tbl
最后一步:table.stream().filter(row -> !hash.containsKey(row[keyColumnNumber]))
.map(row -> row[keyColumnNumber]).map(hash::get)
返回.map(hash::get)
。结果,我需要将所有这些收集到列表中。
Collection<String[]>
返回列表>预期的结果,但
.collect(Collectors.toList())
返回相同的结果。
答案 0 :(得分:5)
您可以像这样使用flatMap:
List<String> list = table.stream()
.map(row -> hash.get(row[keyColumnNumber]))
.filter(Objects::nonNull)
.flatMap(Arrays::stream)
.collect(Collectors.toList());
答案 1 :(得分:4)
如果
table.stream().filter(row -> !hash.containsKey(row[keyColumnNumber]))
.map(row -> row[keyColumnNumber]).map(hash::get)
返回一个Stream<Collection<String[]>>
,而您需要一个List<String[]>
,您确实需要flatMap
:
List<String[]> result = table.stream()
.filter(row -> !hash.containsKey(row[keyColumnNumber]))
.map(row -> row[keyColumnNumber])
.map(hash::get) // Stream<Collection<String[]>>
.flatMap(Collection::stream) // Stream<String[]>
.collect(Collectors.toList()); // List<String[]>
正如Aomine所说,应该有可能将map
和flatMap
调用加入到单个flatMap
中。
List<String[]> result = table.stream()
.filter(row -> !hash.containsKey(row[keyColumnNumber]))
.flatMap(row -> hash.get(row[keyColumnNumber]).stream()) // Stream<String[]>
.collect(Collectors.toList()); // List<String[]>
答案 2 :(得分:-1)
尝试一下。我希望它可以解决...
List<String> list = table.stream().filter(row -> !hash.containsKey(row[keyColumnNumber]))
.map(row -> row[keyColumnNumber])
.flatMap(x -> Arrays.stream(hash.get()))//<<-----------------
.collect(Collectors.toList());