有效使用Java流

时间:2019-02-28 04:18:07

标签: java java-8 java-stream

我得到了一个List<String>,其中有学生的名字和标记(双倍表示为字符串)。名称出现在偶数索引处,标记出现在奇数索引处。该列表类似于:["A", "6.3", "A", "1.4", "B", "6.3", "B", "8.2", "C", "4.2", "C", "3.3", "D", "3.2"]。 (假设给定的列表格式正确。)

我想计算每个学生的平均值,并找出这些平均值中的最高者。我尝试使用Java Stream API做到这一点。这是我的方法:

List<String> list = Arrays.asList("A", "2.5",
        "A", "6.3",
        "A", "1.4", // A's avg is 3.4
        "B", "6.3",
        "B", "8.2", // B's avg is 7.25
        "C", "4.2",
        "C", "3.3", // C's avg is 3.75
        "D", "3.2",
        "D", "2.4", // D's avg is 2.8
        "E", "7.1",
        "E", "9.6" // E's avg is 8.35
);

double maxAvg = IntStream.range(0, list.size())
        .filter(i -> i % 2 == 0)
        .mapToObj(i -> new Person(list.get(i), Double.parseDouble(list.get(i + 1))))
        .collect(Collectors.groupingBy(Person::getName))
        .entrySet()
        .stream()
        .mapToDouble(set -> set.getValue()
                .stream()
                .mapToDouble(Person::getMarks)
                .average()
                .getAsDouble())
        .max()
        .getAsDouble();

System.out.println(maxAvg);

Person类如下所示:

class Person {
    String name;
    double marks;

    Person(String name, double marks) {
        this.name = name;
        this.marks = marks;
    }

    public double getMarks() {
        return marks;
    }

    public String getName() {
        return name;
    }
}

我使用上面的代码得到了正确的结果。但是我想知道我们是否可以简化它,我想知道我是否对此过于复杂了。有更好的替代方法吗?

我们可以以某种方式摆脱Person类吗?

1 个答案:

答案 0 :(得分:4)

您不需要Exercise::with('topic.subject')->get(); 类。您可以直接按名称分组:

Person