Sửa :: Tôi rephrasing câu hỏi để nó rõ ràng hơnJava 8 Streams - Phân nhóm một dòng tuples
Tôi đã viết mã này
List<ImmutablePair<Integer, Integer>> list = new ArrayList<ImmutablePair<Integer, Integer>>();
list.add(new ImmutablePair(1, 1));
list.add(new ImmutablePair(1, 1));
list.add(new ImmutablePair(1, 1));
list.add(new ImmutablePair(2, 2));
list.add(new ImmutablePair(2, 2));
list.add(new ImmutablePair(2, 2));
list.add(new ImmutablePair(3, 3));
list.add(new ImmutablePair(3, 3));
list.add(new ImmutablePair(3, 3));
Stream<ImmutablePair<Integer, Integer>> stream = list.stream();
Map<Integer, Integer> result = stream.collect(Collectors.groupingBy(
ImmutablePair::getLeft,
Collectors.mapping(
ImmutablePair::getRight,
Collectors.summingInt(Comparator.comparing(ImmutablePair::getRight))
)
));
Tôi muốn để xử lý danh sách này sử dụng hơi nước để rằng đầu ra là một bản đồ chứa các khóa (1, 3), (2, 6), (3, 9)
Vì vậy, về cơ bản, chúng tôi nhóm vào mục bên trái của bộ và sau đó tổng hợp mục bên phải.
Mã này không biên dịch và trình biên dịch nói rằng nó không thể giải quyết phương thức getLeft, getRight.
Dưới đây là các thông báo lỗi từ trình biên dịch
/Users/abhi/JavaProjects/MovieLambda2/src/main/java/com/abhi/MovieLambda2.java:229: error: method summingInt in class Collectors cannot be applied to given types;
Collectors.summingInt(Comparator.comparing(ImmutablePair::getRight))
^
required: ToIntFunction<? super T#1>
found: Comparator<Object>
reason: no instance(s) of type variable(s) T#2,U exist so that Comparator<T#2> conforms to ToIntFunction<? super T#1>
where T#1,T#2,U are type-variables:
T#1 extends Object declared in method <T#1>summingInt(ToIntFunction<? super T#1>)
T#2 extends Object declared in method <T#2,U>comparing(Function<? super T#2,? extends U>)
U extends Comparable<? super U> declared in method <T#2,U>comparing(Function<? super T#2,? extends U>)
/Users/abhi/JavaProjects/MovieLambda2/src/main/java/com/abhi/MovieLambda2.java:229: error: incompatible types: cannot infer type-variable(s) T,U
Collectors.summingInt(Comparator.comparing(ImmutablePair::getRight))
^
(argument mismatch; invalid method reference
no suitable method found for getRight(Object)
method Pair.getRight() is not applicable
(actual and formal argument lists differ in length)
method ImmutablePair.getRight() is not applicable
(actual and formal argument lists differ in length))
where T,U are type-variables:
T extends Object declared in method <T,U>comparing(Function<? super T,? extends U>)
U extends Comparable<? super U> declared in method <T,U>comparing(Function<? super T,? extends U>)
/Users/abhi/JavaProjects/MovieLambda2/src/main/java/com/abhi/MovieLambda2.java:229: error: invalid method reference
Collectors.summingInt(Comparator.comparing(ImmutablePair::getRight))
^
non-static method getRight() cannot be referenced from a static context
where R is a type-variable:
R extends Object declared in class ImmutablePair
/Users/abhi/JavaProjects/MovieLambda2/src/main/java/com/abhi/MovieLambda2.java:228: error: invalid method reference
ImmutablePair::getRight,
^
non-static method getRight() cannot be referenced from a static context
where R is a type-variable:
R extends Object declared in class ImmutablePair
/Users/abhi/JavaProjects/MovieLambda2/src/main/java/com/abhi/MovieLambda2.java:226: error: invalid method reference
ImmutablePair::getLeft,
^
non-static method getLeft() cannot be referenced from a static context
where L is a type-variable:
L extends Object declared in class ImmutablePair
Bạn nên đăng một ví dụ đơn giản trình bày vấn đề, nếu không chúng tôi sẽ khó tái tạo nó. – Tunaki
Còn về Collectors.groupBy (ImmutablePair :: getLeft) thì sao? Ý tôi là riêng biệt. Liệu nó cũng thất bại? –
Bạn đang cố gắng nhóm các trường hợp của ImmutablePair bằng cách sử dụng tham chiếu đến một phương thức của Phim. Điều đó không thể hoạt động được. Điều đó giống như phân loại người bởi màu của quả chuối. Bạn có thể sắp xếp mọi người theo chiều cao hoặc cân nặng của họ hoặc tuổi của họ, nhưng không phải bởi một tài sản của một quả chuối. Chúng tôi có thể giải thích thông báo lỗi chính xác có nghĩa là gì nếu bạn đăng thông báo lỗi chính xác thay vì diễn giải nó và đưa ra sự hiểu biết của bạn về thông điệp không chính xác. Chúng tôi có thể giúp bạn sửa mã nếu bạn đăng các lớp học liên quan. –