首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java流对象元素

Java流对象元素
EN

Stack Overflow用户
提问于 2018-04-06 10:16:45
回答 1查看 59关注 0票数 0

我有一个代码块,需要从c#转换为java

代码语言:javascript
运行
复制
public List<Student> getListWithSameStudentSet() {
    return(StudentManager.studentList.ToList().FindAll(m =>
        m.listID != this.listID
        m.studentList.Except(this.studentList).Count() == 0)); 
}

我的尝试如下:

代码语言:javascript
运行
复制
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 19KitKat

EN

回答 1

Stack Overflow用户

发布于 2018-04-07 03:50:09

重构C#代码。

尽管这个问题主要集中在寻找与Java中的C#版本相当的代码上,但我还是想指出一些您可以改进的地方。

理想情况下,您可能希望利用deferred execution,并且只在需要时执行LINQ查询。

即尝试尽可能晚地执行查询。因此,你的方法应该变成:

代码语言:javascript
运行
复制
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元素转换为列表实例。

您所需要做的就是在调用该方法时执行以下操作:

代码语言:javascript
运行
复制
var students = GetListWithSameStudentSet().ToList(); // execution begins here

使用Streams API将C#代码转换为Java

您当前编写的内容肯定没有使用streams API。相反,你想要的是:

代码语言:javascript
运行
复制
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>的返回值,那么你可以这样做:

代码语言:javascript
运行
复制
public Stream<Student> getListWithSameStudentSet() {
         return StudentManager.studentList
                              .filter(m -> m.listId != this.listID &&
                                      this.studentList.containsAll(m.studentList))
                              );
}

在没有Streams API的情况下将C#代码转换为Java

代码语言:javascript
运行
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49684243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档