17

私はJava8ラムダ式で遊んでいました。次に、例として、リストに含まれている年齢層を合計しようとしました。

import java.util.Arrays;
import java.util.List;

public class Person {
    public static void main(String[] args) {
        List<Person> persons = Arrays.asList(new Person("FooBar", 12), new Person("BarFoo", 16));
        Integer sumOfAges = persons.stream().map(Person::getAge).sum();
        System.out.println("summedUpAges: " + sumOfAges);
    }

    private final String name;
    private final Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }
}

このスニペットを次のJavaコンパイラでコンパイルしようとすると:

openjdk version "1.8.0-ea"
OpenJDK Runtime Environment (build 1.8.0-ea-lambda-night
OpenJDK 64-Bit Server VM (build 25.0-b21, mixed mode)

次のコンパイルエラーが発生します。

java: cannot find symbol
  symbol:   method sum()
  location: interface java.util.stream.Stream<java.lang.Integer>

しかし、getAge()メソッドの戻り値をIntegerからintに変更すると、期待どおりの結果が得られます。ただし、署名をその場で変更することが不可能または望まれない場合もあります。getAge()が整数型を返すときにこれを機能させる方法はありますか?

よろしくお願いします、ダニエル

4

3 に答える 3

21

彼らは方法を変えていると思います

IntStream map(ToIntFunction<? super T> mapper)

IntStream mapToInt(ToIntFunction<? super T> mapper)

その後、あなたの

persons.stream().mapToInt(Person::getAge).sum()

getAge()返品intか。かを問わず、常に機能しますInteger

このスレッドを参照してください:http://mail.openjdk.java.net/pipermail/lambda-libs-spec-experts/2013-March/001480.html

ところで、あなたはlambda-devメーリングリストにあなたの質問を投稿することができます、彼らは実際の経験を聞きたいです。

于 2013-03-21T20:14:24.470 に答える
2

これらはメソッドを変更していません。どちらも、map()がStreamを返す一般化されたメソッドであり、int、long、double StreamをmapToInt()、mapToLong()、mapToDoubleなどの個別のメソッドに分離している場合使用できます。 ()。

はい、reduce()メソッドを使用できます

reduce(Tアイデンティティ、BinaryOperator <T>アキュムレータ)

連想累積関数を使用して、このストリームの要素の削減を実行し、削減された値がある場合はそれを説明するオプションを返します。

reduce()のしくみ:int配列のストリームがあり、reduce関数を適用するとします。

reduce(0、(l、r)-> l + r)

1、2、3、4、5などの整数のリストでは、シード0が1に加算され、結果(1)が累積値として格納されます。これは、に加えて左側の値として機能します。ストリーム内の次の番号(1 + 2)として機能します。結果(3)は累積値として保存され、次の加算(3 + 3)で使用されます。結果(6)は保存され、次の加算(6 + 4)で使用され、結果は最終加算(10 + 5)で使用され、最終結果15が生成されます。

したがって、例は次のようになります。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class Person {

    public static void main(String[] args) {
        List<Person> persons = Arrays.asList(new Person("FooBar", 12), new Person("BarFoo", 16));
        Stream<Integer> stream = persons.stream().map(x -> x.getAge());
        int sum = stream.reduce(0, (l, r) -> l + r);
        System.out.println(sum);

    }

    private final String name;
    private final Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }
}
于 2014-03-21T11:16:41.030 に答える
0

bayou.ioの回答を追加するには、メソッド参照ではなくラムダ式を使用します。

persons.stream().mapToInt(x->x.getAge()).sum();
于 2015-04-17T02:19:34.497 に答える