如何在处理Java流时从Java IDE中获取更多返回类型信息?

如何在处理Java流时从Java IDE中获取更多返回类型信息?,java,intellij-idea,types,java-8,java-stream,Java,Intellij Idea,Types,Java 8,Java Stream,考虑以下任务: 给定一个以逗号分隔的城市列表(州、市、人口),生成每个州的州和人口最多的城市以及人口列表。该列表应按州名称排序 cities.csv如下所示: New York, New York, 8491079 Los Angeles, California, 3928864 Chicago, Illinois, 2722389 Houston, Texas, 2239558 Philadelphia, Pennsylvania, 1560297 Phoenix, Arizona, 1537

考虑以下任务:

给定一个以逗号分隔的城市列表(州、市、人口),生成每个州的州和人口最多的城市以及人口列表。该列表应按州名称排序

cities.csv
如下所示:

New York, New York, 8491079
Los Angeles, California, 3928864
Chicago, Illinois, 2722389
Houston, Texas, 2239558
Philadelphia, Pennsylvania, 1560297
Phoenix, Arizona, 1537058
San Antonio, Texas, 1436697
San Diego, California, 1381069
Dallas, Texas, 1281047
San Jose, California, 1015785
...
Alabama, Birmingham [212247]
Alaska, Anchorage [301010]
Arizona, Phoenix [1537058]
Arkansas, Little Rock [197706]
California, Los Angeles [3928864]
...
Texas, Houston [2239558]
private static void mostPopulousCityInState() throws IOException {
            Files.lines(Paths.get("cities.csv")).map(City::new)
                    .collect(groupingBy(City::getState, maxBy(Comparator.comparing(City::getPopulation)))) //1
            .entrySet() //2
            .stream()   //3
            .sorted(Comparator.comparing(e -> e.getKey()))
            .forEach(e -> {
                City city = e.getValue().get();
                System.out.println(e.getKey() + ", " + city.getName() + " [" + city.getPopulation() + "]");
            });
}
预期的输出如下所示:

New York, New York, 8491079
Los Angeles, California, 3928864
Chicago, Illinois, 2722389
Houston, Texas, 2239558
Philadelphia, Pennsylvania, 1560297
Phoenix, Arizona, 1537058
San Antonio, Texas, 1436697
San Diego, California, 1381069
Dallas, Texas, 1281047
San Jose, California, 1015785
...
Alabama, Birmingham [212247]
Alaska, Anchorage [301010]
Arizona, Phoenix [1537058]
Arkansas, Little Rock [197706]
California, Los Angeles [3928864]
...
Texas, Houston [2239558]
private static void mostPopulousCityInState() throws IOException {
            Files.lines(Paths.get("cities.csv")).map(City::new)
                    .collect(groupingBy(City::getState, maxBy(Comparator.comparing(City::getPopulation)))) //1
            .entrySet() //2
            .stream()   //3
            .sorted(Comparator.comparing(e -> e.getKey()))
            .forEach(e -> {
                City city = e.getValue().get();
                System.out.println(e.getKey() + ", " + city.getName() + " [" + city.getPopulation() + "]");
            });
}
我的尝试(经过反复试验并遵循Java 8流的cookbook风格处理)如下所示:

New York, New York, 8491079
Los Angeles, California, 3928864
Chicago, Illinois, 2722389
Houston, Texas, 2239558
Philadelphia, Pennsylvania, 1560297
Phoenix, Arizona, 1537058
San Antonio, Texas, 1436697
San Diego, California, 1381069
Dallas, Texas, 1281047
San Jose, California, 1015785
...
Alabama, Birmingham [212247]
Alaska, Anchorage [301010]
Arizona, Phoenix [1537058]
Arkansas, Little Rock [197706]
California, Los Angeles [3928864]
...
Texas, Houston [2239558]
private static void mostPopulousCityInState() throws IOException {
            Files.lines(Paths.get("cities.csv")).map(City::new)
                    .collect(groupingBy(City::getState, maxBy(Comparator.comparing(City::getPopulation)))) //1
            .entrySet() //2
            .stream()   //3
            .sorted(Comparator.comparing(e -> e.getKey()))
            .forEach(e -> {
                City city = e.getValue().get();
                System.out.println(e.getKey() + ", " + city.getName() + " [" + city.getPopulation() + "]");
            });
}
(为了简洁起见,省略了类
City
,但它具有相当直观的构造函数和getter)

这似乎还可以(尽管还可以改进)。但我的问题更多的是关于如何从总体上考虑Java 8流:


  • 例如,我是否可以将光标放在
    收集
    上,然后执行一些键盘快捷键,告诉我它返回一个
    地图
    ?如果我在这里“导航到源代码”,那么它将带我进入
    Stream.java
    中的泛型定义,其中显示了
    R collect(收集器您可以用一种更简单的方法来实现这一点:您不需要在分组操作后对地图进行明确排序:您可以直接使用自定义的
    SortedMap
    。在这种情况下,地图工厂可以是
    TreeMap::new
    ,它将按照状态名称的升序创建
    SortedMap

    还请注意,返回的流应在资源试用中关闭:

    返回的流封装了
    读取器
    。如果需要及时处理文件系统资源,则应使用try-with-resources构造来确保在流操作完成后调用流的close方法


    对于您的问题,我无法说明Eclipse是如何做到这一点的,但在IntelliJ中,您可以按住键(Mac上的Cmd)并将鼠标悬停在map或filter函数调用上以查看类型,并解析泛型

    eclipse是否有一个重构工具,可以让您选择一个子表达式并将其提取到一个新的局部变量?这将创建一个显示管道中当前类型的变量。我有时会在IntelliJ中这样做,当我在获取正确的函数类型时,我知道eclipse有类似的重构工具

    对于您的(3),我们希望时间(或者更准确地说,经验)能够更好地理解Java的类型系统。。。。