Nat*_*H06 1 java generics lambda filter java-8
我在一个方法中有一个并行流,当我以这种方式运行时,它工作正常:
Meeting是一个接口,其实现具有private int id成员字段和一个getter方法getId();
public class MyClass {
private List<Meeting> myMeetings = new ArrayList<>();
public PastMeeting getPastMeeting (int id){
Meeting meetingWithId;
meetingWithId = myMeetings.parallelStream()
.filter(meeting -> meeting.getId() == id )
.findFirst()
.get();
return meetingWithId;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我将不得不从myClass中的其他几个方法执行此操作,因此我需要将该操作设置为自己的方法,并且我已将下面的方法添加到myClass,因为我可能有不同的Meeting实现,因此不同列表的类型也是如此,因此我将参数设置为通用.但是,当我以这种方式运行时,过滤器无法访问Meeting的getId()方法,称它"无法解析m.getId();"
private <T, R> T returnMeeting(T meeting, List<R> meetingList, int id) {
meeting = meetingList.parallelStream()
.filter(m -> m.getId() == id )
.findFirst()
.get();
return meeting;
}
Run Code Online (Sandbox Code Playgroud)
我不确定为什么,因为代码完全一样.运行泛型参数字段是否会导致lambda可以假设的中断?谢谢.
由于您没有为通用参数添加类型边界,因此您只能Object使用可用的方法.
您有两种选择:
添加一个类型绑定,强制执行具有您要使用的方法的特定类型/接口.
interface IdProvider {
int getId();
}
private <T extends IdProvider> T returnMeeting(List<T> meetingList, int id) {
return meetingList.parallelStream()
.filter(m -> m.getId() == id )
.findFirst()
.get();
}
Run Code Online (Sandbox Code Playgroud)
或者在方法中添加另一个参数,用于定义如何解析id
private <T> T returnMeeting(List<T> meetingList, int id, Function<T,Integer> idGetter) {
return meetingList.parallelStream()
.filter(m -> idGetter.apply(m).equals(id) )
.findFirst()
.get();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |