我有一个代码块,需要从c#
转换为java
public List<Student> getListWithSameStudentSet() {
return(StudentManager.studentList.ToList().FindAll(m =>
m.listID != this.listID
m.studentList.Except(this.studentList).Count() == 0));
}
我的尝试如下:
List<UUID> checklist = stream(StudentManager.studentList).select(m -> m.getstudentList()).first();
checklist.removeAll(this.studentList);
return(stream(ApplianceDataManager.signatureList).where(m ->
m.getListID() != this.listID &&
checklist.size() == 0)).toList();
我所知道的是流.first()
没有执行FindAll
。有没有什么方法可以让我在获得.Except
的同时也获得FindAll
?
提前通知:我的设备使用带API level 19
的KitKat
发布于 2018-04-07 03:50:09
重构C#代码。
尽管这个问题主要集中在寻找与Java
中的C#
版本相当的代码上,但我还是想指出一些您可以改进的地方。
理想情况下,您可能希望利用deferred execution,并且只在需要时执行LINQ查询。
即尝试尽可能晚地执行查询。因此,你的方法应该变成:
public IEnumerable<Student> GetListWithSameStudentSet() {
return StudentManager.studentList
.Where(m => m.listID != this.listID &&
!m.studentList.Except(this.studentList)
.Take(1)//short circuit
.Any()
);
}
现在,这意味着即使您调用此方法,也不会执行任何东西;相反,只有在枚举返回的IEnumerable
或对其调用急切操作时,才会执行此方法,在本例中,您希望将IEnumerable
元素转换为列表实例。
您所需要做的就是在调用该方法时执行以下操作:
var students = GetListWithSameStudentSet().ToList(); // execution begins here
使用Streams API将C#代码转换为Java
您当前编写的内容肯定没有使用streams API。相反,你想要的是:
public List<Student> getListWithSameStudentSet() {
return StudentManager.studentList
.filter(m -> m.listId != this.listID &&
this.studentList.containsAll(m.studentList))
.collect(Collectors.toList());
}
或者,如果你想返回一个Stream<T>
来模仿C#
版本中IEnumerable<T>
的返回值,那么你可以这样做:
public Stream<Student> getListWithSameStudentSet() {
return StudentManager.studentList
.filter(m -> m.listId != this.listID &&
this.studentList.containsAll(m.studentList))
);
}
在没有Streams API的情况下将C#代码转换为Java
public List<Student> getListWithSameStudentSet() {
List<Student> accumulator = new ArrayList<>();
for(Student student : StudentManager.studentList){
if(student.listId != this.listID &&
this.studentList.containsAll(student.studentList)){
accumulator.add(student);
}
}
return accumulator;
}
https://stackoverflow.com/questions/49684243
复制相似问题