Java manupilate使用stream方法在列表中创建对象

Java manupilate使用stream方法在列表中创建对象,java,list,dictionary,foreach,java-stream,Java,List,Dictionary,Foreach,Java Stream,我有一个名为Employee的类,包含以下内容:名字、姓氏、薪水和职位,我想练习stream方法并处理对象中的数据,就像我想计算员工名字中有多少大写字母一样,但我的问题是,我得到的对象是一个整体对象,如果我想使用foreach方法循环得到对象的一个实例,那么作为foreach是终端操作,所以我如何循环遍历列表,获取每个员工的名字,并检查它包含多少大写字母。 以下是我一直试图做的: public class Main { public static void main(String[]

我有一个名为Employee的类,包含以下内容:名字、姓氏、薪水和职位,我想练习stream方法并处理对象中的数据,就像我想计算员工名字中有多少大写字母一样,但我的问题是,我得到的对象是一个整体对象,如果我想使用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;
    }

}
公共类主{
公共静态void main(字符串[]args){
员工emp=新员工();
列表=新的ArrayList();
emp.setFirstName(“约翰”);
emp.setLastName(“标记”);
环境管理设置位置(“开发”);
emp.setSalary(1000);
列表。添加(emp);
list.stream().forEach(i->i.getFirstName());
System.out.println(isLower(list));
}
公共静态字符串isLower(列表列表){
System.out.println(“我在这里”);
Stream=empList.Stream();
返回stream.map(i->i.getFirstName()).toString();
}
静态布尔isDigit(char[]ch){
System.out.println(“我在这里2”);
for(字符c:ch)
返回c>='0'&&c='a'&&c='a'&&c
我如何循环浏览列表,获取每个员工的名字并进行检查
它包含多少大写字母

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

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();

注意:
list.stream().forEach(i->i.getFirstName());
基本上什么都不做,因为流方法从不修改底层数据结构。您希望
stream.toString()
返回什么?与
isDigit()
isLowerCase()
isUpperCase()有什么关联
?@mc10但我仍然不想修改这里的任何内容,我只是想得到firstName@shmosel我仍然没有使用这些方法,但是如果字符串(firstName)为包含数字、大写或字母非常感谢这就是我要找的,你能给我一个很好的参考来学习这些函数吗?如果我把regx从[a-Z]改为[a-Z],为什么我会得到零如果我想数一数小写的话letters@KhaledJamal,出现了一个小问题,更新了答案。现在应该可以正常工作了。split函数的使用似乎不仅仅是一个小问题。我要编写
mapToLong(s->s.chars().filter(c->Character.isUpperCase((char)c)).count()
@Louis Wasserman:您不需要lambda进行类型转换。您只需使用
s->s.codePoints().filter(Character::isUpperCase.count()
或在单个流中执行整个操作:
list.stream().map(Employee::getFirstName)。flatMapToInt(String::codePoints)。filter(Character::isUpperCase)。count();