将Collection <string []>的流转换为List <string> []

时间:2018-07-10 09:58:00

标签: java java-8 java-stream

我有一段代码:

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())

返回相同的结果。

3 个答案:

答案 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所说,应该有可能将mapflatMap调用加入到单个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());