当前位置: 首页 > 知识库问答 >
问题:

在DTO上使用lamda表达式的流

慕承允
2023-03-14

我有学生类的数组。学生类有两个字段1.private最后的字符串firstName;2.private最后的布尔值是当前;

如果学生处于非活动状态,在学生类中出现的检查当前api将给出错误的值。

下面是我的DTO课程。

/**
* A class representing a single student in a single class.
*/
public final class Student2 {
/**
 * First name of the student.
 */
private final String firstName;
/**
 * Whether the student is currently enrolled, or has already completed the
 * course.
 */
private final boolean isCurrent;

/**
 * Constructor.
 * @param setFirstName Student first name
 * @param setIsCurrent Student currently enrolled?
 */
public Student2(final String setFirstName,final boolean setIsCurrent) {
    this.firstName = setFirstName;
    this.isCurrent = setIsCurrent;
}

/**
 * Get the first name of this student.
 * @return The student's first name.
 */
public String getFirstName() {
    return firstName;
}


/**
 * Check if this student is active, or has taken the course in the past.
 * @return true if the student is currently enrolled, false otherwise
 */
public boolean checkIsCurrent() {
    return isCurrent;
}
}

现在我想知道最常见的不活跃学生的名字?

我想这样做,与平行流?

 public String mostCommonFirstNameOfInactiveStudentsParallelStream(final Student[] studentArray) {
       try{
            return Stream.of(studentArray)
                     .parallel()
                     .filter(s->!s.checkIsCurrent())
                     .map(s->s.getFirstName())                   
          }
          catch(Exception e){
             throw e;
          }
 }

什么是并行流代码

共有2个答案

百里金林
2023-03-14

可以使用group pingBy收集器:

   return Stream.of(studentArray)
                .parallel()
                .filter(s -> !s.checkIsCurrent()) 
                .map(Student::getFirstName())   
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
                .entrySet()
                .stream()
                .min(Map.Entry.<String, Long>comparingByValue().reversed())
                .map(Entry::getKey).orElse(null);

另一个选项是使用Collections.frequency,尽管这需要覆盖equals/hashcode

许庆
2023-03-14

您应该决定您的类是学生还是学生。此外,不要插入任意的代码块。

实现这一目标的一种方法是

public String mostCommonFirstNameOfInactiveStudentsParallelStream(Student2[] studentArray){
    return Arrays.stream(studentArray)
             .parallel()
             .filter(s->!s.checkIsCurrent())
             .collect(Collectors.toMap(Student2::getFirstName, s -> 1, Integer::sum))
             .entrySet().stream()
             .max(Map.Entry.comparingByValue())
             .map(Map.Entry::getKey)
             .orElse(null);
}

另一种选择是

public String mostCommonFirstNameOfInactiveStudentsParallelStream(Student2[] studentArray){
    return Arrays.stream(studentArray)
             .parallel()
             .filter(s->!s.checkIsCurrent())
             .collect(Collectors.groupingByConcurrent(Student2::getFirstName,
                                                      Collectors.summingInt(s -> 1)))
             .entrySet().stream()
             .max(Map.Entry.comparingByValue())
             .map(Map.Entry::getKey)
             .orElse(null);
}

哪一个更快,取决于几种情况。您还可以将toMap替换为toConcurrentMap,或将groupingByConcurrent替换为groupingBy,最终得到四个备选测试。

但最有可能的是,顺序流无论如何都会比并行流快,因为不太可能有这么多对象,并行处理会有回报。

 类似资料:
  • 我试图理解lambda函数如何在Java中使用堆 有人能告诉我什么

  • 本文向大家介绍请你说说Lamda表达式的优缺点。相关面试题,主要包含被问及请你说说Lamda表达式的优缺点。时的应答技巧和注意事项,需要的朋友参考一下 考察点:Java基础 优点:1. 简洁。2. 非常容易并行计算。3. 可能代表未来的编程趋势。 缺点:1. 若不用并行计算,很多时候计算速度没有比传统的 for 循环快。(并行计算有时需要预热才显示出效率优势)2. 不容易调试。3. 若其他程序员没

  • that,给定一个包含N个整数的数组A,返回A中不出现的最小正整数(大于0)。 例如,给定A=[1, 3, 6, 4, 1, 2],函数应该返回5。 给定A=[1,2,3],函数应该返回4。 给定一个=[−1.−3] ,函数应返回1。 为以下假设编写一个有效的算法:

  • 问题内容: 我正在尝试对Elasticsearch查询进行否定前瞻,正则表达式为: 我要匹配的文本是: 归还了住宿费用,但仍存在建筑问题。喷洒化学药品会引起健康问题,并引起眼睛刺激。 我没有任何幸运。有人可以帮忙吗? ES查询: 问题答案: 您可以使用以下两种方法之一来解决此问题: 要么 带可选的(因为 默认情况下 为ON ) 它是如何工作的? 在常见的NFA正则表达式中,通常会有负面的环顾四周,

  • 作为背景,如果我想比较两个字段,我不能使用以下语法(因为它比较的是文字字符串“$lastname”,而不是$lastname字段的内容): 我得用这个: 如果我想测试一个字段是否存在,我必须使用第一种格式: 我认为用后一种格式表达$exists运算符的正确方法会引发错误: 这是否意味着至少在某些情况下不可能组合这些操作?具体地说,假设我想查找存在$fullname$或$firstname$ne$l