Java 8流使用具有布尔字段的元素执行某些操作

Flo*_*Lei 5 java lambda java-8 java-stream

我想从列表中创建流,如果某个字段为真,则对某个对象执行某些操作.

让我告诉你到目前为止我做了什么:

    List<UserData> userDataList = new ArrayList<>();

    phoneNumbers.forEach(phoneNumber -> {
        if (phoneNumber.getPrimary()) {
            UserData userData = new UserData();
            userData.setDescription(phoneNumber.getType());
            userData.setValue(phoneNumber.getNumber);
            userDataList.add(userData);
        }
    });
Run Code Online (Sandbox Code Playgroud)

因此,如果phoneNumber.getPrimary() == true不执行以下任务,请忽略它.

Era*_*ran 9

是的,你可以结合filter使用map来改造List相关要素进入StreamUserData,然后将它们收集到List:

List<UserData> userDataList =
    phoneNumbers.stream()
                .filter(p -> p.getPrimary()) // or filter(ClassName::getPrimary)
                .map(p -> {
                         UserData userData = new UserData();
                         userData.setDescription(p.getType());
                         userData.setValue(p.getNumber());
                         return userData;
                         })
                .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

如果UserData有一个带有类型和数字的构造函数,你可以缩短代码:

List<UserData> userDataList =
    phoneNumbers.stream()
                .filter(p -> p.getPrimary()) // or filter(ClassName::getPrimary)
                .map(p -> new UserData(p.getType(),p.getNumber()))
                .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

  • 当精确的顺序不重要时,应该优先使用@Eran`findAny()` (2认同)