【问题标题】:Java manupilate an object in a list with the stream methodJava 使用流方法操作列表中的对象
【发布时间】:2017-08-28 19:50:50
【问题描述】:

我有一个名为 Employee 的类,它具有以下内容:firstName、lastName、salary 和 position,我想练习流方法并操作对象中的数据,就像我想计算对象中有多少个大写字母一样员工的名字,但我的问题是我将对象作为一个整体对象获取,如果我想使用 foreach 方法循环遍历它以获取我的对象的一个​​实例,之后我将无能为力,因为 foreach 是终端操作,所以如何遍历列表获取每个员工的名字并检查它包含多少个大写字母。 这是我一直在尝试做的事情:

public class Main {

    public static void main(String[] args) {

        Employee emp = new Employee();
        List<Employee> list = new ArrayList<>();

        emp.setFirstName("John");
        emp.setLastName("Mark");
        emp.setPosition("dev");
        emp.setSalary(1000);

        list.add(emp);
        list.stream().forEach(i -> i.getFirstName());
        System.out.println(isLower(list));

    }

    public static String isLower(List<Employee> empList) {
        System.out.println("I am here");
        Stream<Employee> stream = empList.stream();
        return stream.map(i -> i.getFirstName()).toString();
    }

    static boolean isDigit(char[] ch) {
        System.out.println("I am here2");
        for (char c : ch)
            return c >= '0' && c <= '9';
        return false;

    }

    static boolean isLowerCase(char[] ch) {
        for (char c : ch)
            return c >= 'a' && c <= 'z';
        return false;
    }

    static boolean isUpperCase(char[] ch) {
        for (char c : ch)
            return c >= 'A' && c <= 'Z';
        return false;
    }

}

很抱歉提出这么愚蠢的问题,但我是 Java 初学者并正在努力学习

【问题讨论】:

  • 注意:list.stream().forEach(i -&gt; i.getFirstName()); 基本上什么都不做,因为流方法从不修改底层数据结构。
  • 您希望Stream.toString() 会返回什么?
  • isDigit()isLowerCase()isUpperCase() 的相关性是什么?
  • @mc10 但我仍然没有尝试在这里修改任何内容,我只是想获得名字
  • @shmosel 我仍然没有使用这些方法,但如果字符串(firstName)包含数字或大写或字母,我想使用它们返回 true

标签: java list dictionary foreach java-stream


【解决方案1】:

如何遍历列表获取每个员工的名字并检查 它包含多少个大写字母

统计每个员工名字中大写字母的个数

list.stream()
    .map(Employee::getFirstName)
    .mapToInt(s -> s.split("[A-Z]", -1).length - 1)
    .forEach(System.out::println);

全部大写字母

list.stream()
    .map(Employee::getFirstName)
    .mapToInt(s -> s.split("[A-Z]", -1).length - 1)
    .sum();

【讨论】:

  • 非常感谢这就是我正在寻找的东西,你能给我一个很好的参考来学习这些功能吗?
  • 如果我将正则表达式从 [A-Z] 更改为 [a-z] 那为什么我会得到零,如果我想计算小写字母
  • @KhaledJamal,有一个小问题,更新了答案。现在应该可以正常工作了。
  • split 函数的使用似乎有点骇人听闻。我会写mapToLong(s -&gt; s.chars().filter(c -&gt; Character.isUpperCase((char) c)).count())
  • @Louis Wasserman:你不需要带有类型转换的 lambda。您可以只使用 s -&gt; s.codePoints().filter(Character::isUpperCase).count() 或在单个流中执行整个操作:list.stream() .map(Employee::getFirstName) .flatMapToInt(String::codePoints) .filter(Character::isUpperCase) .count();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
相关资源
最近更新 更多