java - 从流中获取父对象

标签 java java-8 java-stream

我有这门课:

public class StructUserType extends UserType {

    MembersList membersList = new MembersList();

    public List<Member> getMembers() {
        return Collections.unmodifiableList(membersList.members);
    }

    static class MembersList {
        List<Member> members = new ArrayList<>();
    }

    public static class Member implements Identifiable {
        private Integer id;

        public Integer getId() {
            return id;
        }
    }    
} 

我有一个 List 对象:

List<SmbpUserType> userTypes = new ArrayList<>();

我想找到等于某个 id 的 Member。我试过如下:

Integer id = 1;
userTypes.stream()
                .filter(StructUserType.class::isInstance)
                .map(StructUserType.class::cast)
                .forEach(structUserType -> {
                    structUserType.getMembers()
                            .stream()
                            .filter(m -> m.getId() == id)
                            .findFirst().orElse(null);
                });

我想,当内部流中的过滤器运行并找到第一个成员时,返回该成员包含的父元素,那些 UserType

经典风格的模拟:

for (UserType userType : userTypes) {
            if (userType instanceof StructUserType) {
                List<StructUserType.Member> members = ((StructUserType) userType).getMembers();

                for (StructUserType.Member member : members) {
                    if (member.getId() == id) {
                        return userType;
                    }
                }
            }
        }
        return null;

最佳答案

filter替换forEach,寻找满足内部流管道条件的StructUserType实例。然后获取 Stream 的第一个元素(如果存在)。

return
   userTypes.stream()
            .filter(StructUserType.class::isInstance)
            .map(StructUserType.class::cast)
            .filter(st -> st.getMembers()
                            .stream()
                            .anyMatch(m -> m.getId().equals(id)))
            .findFirst()
            .orElse(null);

关于java - 从流中获取父对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48906718/

相关文章:

java - 使用 Java 流检查 ArrayList 内容

java - Streams 中的 map() 如何工作以及当参数是 Collection 时如何使用它

java - 适配器的内容已更改,但 ListView 未收到通知。内容适配器未从后台线程修改

java - Maven 依赖项和 jetty - 避免部署

java - 如何在 Java 8 中创建 Map<Integer, Map<String, Integer>> 类型的映射?

java-8 - 如何在 stream.collect(Collectors) 中指定具体的集合类型

Java的compareTo方法-找不到符号错误

java - 了解字节缓冲区

java - 将字段数据从 Map<Integer, Object> 提取到 String

java - 如何使用 Stream API Java 8 生成随机整数数组?