使用Java 8流API将列表的列表展平为列表

时间:2018-11-28 09:03:03

标签: java java-8 java-stream

我有以下代码,使用Java 8流API可能会更简单:

List<List<String>> listOfListValues;
public List<String> getAsFlattenedList() {
        List<String> listOfValues= new ArrayList<>();
        for (List<String> value: listOfListValues) {
            listOfValues.add(String.valueOf(value));
        }
        return listOfValues;
    }

我在SO上搜索了一个解决方案,发现了这一点:

listOfListValues.stream()
        .flatMap(List::stream)
        .collect(Collectors.toList());

但这与我想要的功能不同。

4 个答案:

答案 0 :(得分:6)

您在这里只需要一个“简单” map

List<List<String>> listOfListValues;
public List<String> getAsFlattenedList() {
    return listOfListValues.stream()
            .map(String::valueOf)
            .collect(toList());
}

flatMap用于将一个Stream转换为另一个Stream,如果您需要的条目数少于或少于当前可用的条目,则有意义(或者仅需新映射的listOfListValues.stream() .flatMap(List::stream) // we want to count all, also those from the "inner" list... .distinct() .count() 即可进行过滤/映射/ etc再往下移),例如:

  • 计算所有列表的所有唯一字符串:

    listOfListValues.stream()
            .flatMap(list -> {
                if (list.size() > 3) // in this case we use only some of the entries
                    return Stream.concat(list.subList(0, 2).stream(), Stream.of("..."));
                else
                    return list.stream();
            })
            .collect(Collectors.toList());
    
  • 在一定大小后截断条目:

    Map<Key, List<Value>> map = new HashMap<>();
    Stream<Value> valueStream = interestedKeys.stream()
                                              .map(map::get)
                                              .flatMap(List::stream);
    
  • 为多个感兴趣的键拼合地图的值:

    def f(x):
        try:
           date_thr = x.iat[5]
        except:
            date_thr = x.max()
        return date_thr
    
    s = (df.sort_values(['AsOfDate'])
           .groupby(['CompanyName', 'FiscalYear'], sort=False)['AsOfDate']
           .transform(f))
    df['cleanse_filter'] = df['AsOfDate'] < s
    print (df)
             CompanyName  MetricValue   AsOfDate  FiscalYear  cleanse_filter
    49  360Networks Inc.     -295.945 2001-03-31        2000            True
    50  360Networks Inc.      101.992 2001-04-30        2000            True
    51  360Networks Inc.      101.992 2001-05-31        2000            True
    52  360Networks Inc.      101.992 2001-06-30        2000            True
    53  360Networks Inc.      101.992 2001-07-31        2000            True
    54  360Networks Inc.      101.992 2001-08-31        2000           False
    55  360Networks Inc.      101.992 2001-09-30        2000           False
    56  360Networks Inc.      101.992 2001-10-31        2000           False
    57  360Networks Inc.      101.992 2001-11-30        2000           False
    58  360Networks Inc.      101.992 2001-12-31        2000           False
    

答案 1 :(得分:4)

无需使用平面图。

import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';

void main() {
  runApp(Scaffold(
    body: Center(
      child: RaisedButton(
        onPressed: _launchURL,
        child: Text('Show Flutter homepage'),
      ),
    ),
  ));
}

_launchURL() async {
  const url = 'https://flutter.io';
  if (await canLaunch(url)) {
    await launch(url);
  } else {
    throw 'Could not launch $url';
  }
}

说明: listOfListValues.stream() .map(String::valueOf) .collect(Collectors.toList()); 函数结合了flatMapmap操作。不需要。展平意味着将flat转换为[ [1,2,3],[4,5,6,7],[8,9] ],即将2D数组转换为1D数组。

答案 2 :(得分:2)

您可以这样做

listOfListValues.stream().map(List::toString).collect(Collectors.toList());

答案 3 :(得分:0)

您可以在此处使用flatMap:

  List<List<Integer>> listOfLists = new ArrayList<>();
    listOfLists.add(Arrays.asList(1,2,3,4,5));
    listOfLists.add(Arrays.asList(10,20,30,40));
    listOfLists.add(Arrays.asList(100,200,300,400));

    System.out.println(listOfLists);

    List<Integer> collect = listOfLists.stream().flatMap(Collection::stream).collect(Collectors.toList());
    System.out.println(collect);

输出为: [[1、2、3、4、5],[10、20、30、40],[100、200、300、400]]

[1、2、3、4、5、10、20、30、40、100、200、300、400]