【问题标题】:How to filter an arraylist by a char value that was input by a user如何通过用户输入的字符值过滤数组列表
【发布时间】:2019-09-18 12:13:37
【问题描述】:

尝试按名字的第一个字母过滤学生的 ArrayList。 char 值是用户定义的。

我尝试将 char 更改为字符串并使用显示“”而不是 char firstLetter。

ArrayList<Student> studentList = new ArrayList<>(Arrays.asList(students));

System.out.println("Please enter the first letter a students name: ");
firstLetter = keyboard.nextLine().charAt(0);

Student student1 = student.stream().filter(x -> x.getFirstName().indexOf(firstLetter) == 0)
            .map(Student::getFirstName).findAny().orElse(Null);

目标是从数组中打印学生列表,其名称以用户输入的字母开头。获取 char 不能被取消引用错误。

【问题讨论】:

  • 您的 IDE 可能在 firstLetter.equals(x.getFirstName()) 上向您发出警告。这种比较没有多大意义。提示:获取名字的第一个字符/字母。
  • Student student = studentList.stream().filter(x -&gt; firstLetter.equals(x.getFirstName())) .map(Student::getFirstName).findAny().orElse(Null); 正在返回 Student::getFirstName 的类型(可能是 String),而不是 Student
  • @Ezequiel 这是否意味着我应该使用 (String::getFistName)?当我尝试它创建一个无效的方法引用时。
  • 这意味着代码无法编译。为了使其可编译,您的代码应类似于 'String studentFirstName = student.stream() .filter(x -> x.getFirstName().indexOf(firstLetter) == 0) .map(Student::getFirstName).findAny() .orElse(null);'.无论如何,这不是你所期望的。您需要一个学生列表,因此请尝试以下提供的解决方案。

标签: java java-stream


【解决方案1】:

您可以改为使用:

.filter(x -> x.getFirstName().startsWith(String.valueOf(firstLetter)))

并摆脱正在使用的mapping

.map(Student::getFirstName)

这样您在结果实体中没有字符串。

【讨论】:

    【解决方案2】:
    //List<Student> studentL = new ArrayList<>(Arrays.asList(students));
    
    System.out.println("Please enter the first letter a students name: ");
    String prefix = keyboard.nextLine(); //.substring(0, 1);
    
    List<Student> foundStudents = Stream.of(students
            .filter(x -> x.getFirstName().startsWith(prefix))
            .sorted(Comparator.comparing(Student::getFirstName)
                 .thenComparing(Studen::getLastName))
            .collect(Collectors.toList());
     System.out.printf("  %25s %s%n", "First_name", "Last_name");
     for (Student foundStudent : foundStudents) {
         System.out.printf("- %25s %s%n",
                 foundStudent.getFirstName(), foundStudent.getLastName());
     }
     System.out.printf("%d Students found.%n", foundStudents.size());
    

    这将打印找到的学生列表。限制为单个字母似乎过于严格。

    错误是针对使用 equals 的 char firstLetter:

    firstLetter.equals(x.getFirstName())
    

    应该是什么(假设名字总是非空的):

    firstLetter == x.getFirstName.charAt(0)
    

    【讨论】:

      【解决方案3】:

      问题是firstLetter 不是一个对象,因此你不能在它上面调用方法。你可以做的是(假设FirstNameCharacter,因此是一个可以调用方法的对象):

      Student student1 = student.stream()
                                .filter(x -> x.getFirstName().equals(firstLetter))
                                .map(Student::getFirstName)
                                .findAny()
                                .orElse(Null);
      

      甚至更好(使用拆箱):

      Student student1 = student.stream()
                                .filter(x -> firstLetter == x.getFirstName())
                                .map(Student::getFirstName)
                                .findFirst()
                                .orElse(null);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-23
        相关资源
        最近更新 更多