2013-03-21 29 views
13

Tôi đã chơi xung quanh với các biểu thức lambda Java8. Như một ví dụ tôi sau đó đã cố gắng để tổng hợp các lứa tuổi người chứa trong một danh sách:Java 8 Lambdas: Ánh xạ một Stream để nhập Integer và sau đó gọi sum() sẽ không biên dịch

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; 
    } 
} 

Khi tôi cố gắng biên dịch đoạn mã này với trình biên dịch java sau:

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) 

tôi nhận được lỗi biên dịch sau :

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

Nhưng nếu tôi thay đổi giá trị trả về của phương thức getAge() từ Integer thành int, tôi nhận được kết quả mong đợi. Nhưng đôi khi không thể hoặc muốn thay đổi chữ ký khi đang bay. Có cách nào để làm việc này khi getAge() trả về một kiểu Integer không?

Cảm ơn trước, Daniel

+0

'reduce()' cũng hoạt động - 'map (Person :: getAge) .reduce (0, Integer :: sum)' – ZhongYu

Trả lời

16

Tôi nghĩ rằng họ đang thay đổi phương pháp

IntStream map(ToIntFunction<? super T> mapper) 

để

IntStream mapToInt(ToIntFunction<? super T> mapper) 

sau đó bạn

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

chí ALW ays làm việc, cho dù getAge() trả về int hoặc Integer.

Xem chủ đề này: http://mail.openjdk.java.net/pipermail/lambda-libs-spec-experts/2013-March/001480.html

BTW bạn có thể đăng câu hỏi lên mailing list lambda-dev, họ muốn nghe kinh nghiệm thế giới thực.

2

Họ không thay đổi phương pháp, cả hai trong số đó là có sẵn nơi như đồ() là một phương pháp tổng quát mà trả Stream, và họ đã tách int, long, Suối đúp vào phương pháp riêng biệt như mapToInt(), mapToLong() và mapToDouble().

Có, bạn có thể sử dụng giảm() phương pháp

giảm (tính T, BinaryOperator < T> ắc)

Thực hiện giảm trên các yếu tố của dòng này, sử dụng một chức năng tích lũy kết hợp, và trả về tùy chọn mô tả giá trị đã giảm, nếu có.

Làm thế nào giảm() hoạt động: giả sử chúng ta có dòng của mảng int và chúng tôi áp dụng các chức năng giảm

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

Trong một danh sách các số nguyên như 1, 2, 3, 4 và 5, hạt giống 0 được thêm vào 1 và kết quả (1) được lưu trữ dưới dạng giá trị tích lũy, sau đó đóng vai trò là giá trị bên trái ngoài việc phân phát dưới dạng số tiếp theo trong luồng (1 + 2). Kết quả (3) được lưu trữ dưới dạng giá trị tích lũy và được sử dụng trong phần bổ sung tiếp theo (3 + 3).Kết quả (6) được lưu trữ và sử dụng trong lần bổ sung tiếp theo (6 + 4), và kết quả được sử dụng trong phần bổ sung cuối cùng (10 + 5), cho kết quả cuối cùng 15.

Vì vậy, ví dụ bạn sẽ trông giống như :

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; 
    } 
} 
0

Để thêm câu trả lời bayou.io, tôi thích biểu thức lambda thay vì tham chiếu phương pháp.

persons.stream().mapToInt(x->x.getAge()).sum(); 
Các vấn đề liên quan