的Java 8个嵌套流

的Java 8个嵌套流

问题描述:

假设你有结构类这样的:的Java 8个嵌套流

public class Review{ 
    private Integer idReview; 
    private String description; 
    private ArrayList<RelReviewImage> images; 
} 

public class RelReviewImage{ 
    private Integer idRelReviewImage; 
    private Integer idImage; 
    private String name; 
} 

利用Java 8和Stream小号,我们希望做一个过滤器为idImage,并返回Review对象。
可能吗?一个级别很容易,但2级我们找不到任何示例或文档。

+1

你的问题不清楚 - 您可以显示的代码的例子有输入和预期的输出? – assylias 2014-12-01 20:09:46

猜你需要什么:(假设干将可供ReviewRelReviewImage

List<Review> originalReviews = ... 

List<Review> result = originalReviews.stream() 
    .filter(review -> review.getImages().stream() //Nested streams. Assume getImages() never null, but empty 
          .anyMatch(image -> image.getIdImage() == 123)) //'2 level' here 
    .collect(Collectors.toList()); 

我想你可以通过不尝试了一个班轮在这里获得最大的维护和优雅的代码。 :)

当我有这些嵌套结构时,我通常会为创建一个每个级别的新方法。所以,当我编码时,我一次只能在脑海中一个层次。

尝试将检查是否存在imageId的图像的部分拉入Predicate

A Predicate这里是一个Function需要你的Review并返回一个Boolean可以过滤。

public List<Review> filterReviews(){ 
    Integer idImage = 1; 
    List<Review> reviews = new ArrayList<>(); 
    ... 
    List<Review> result = reviews.stream() 
      .filter(hasImage(idImage)) 
      .collect(Collectors.toList()); 

    return result; 
} 

private Predicate<Review> hasImage(final Integer idImage){ 
    return review -> review.images.stream() 
      .anyMatch(image -> Objects.equals(image.idImage, idImage)); 
} 

普罗蒂普

如果filterReviews - 方法采取了Predicate作为参数,你可以用同样的方法,在所有不同领域的过滤器内部Review,通过传递不同Predicates

+0

我认为将'hasImage'方法添加到'Review'类中会更好,它只是返回普通的旧'boolean'。然后你可以'.filter(Review :: hasImage)'。这也将封装“图像”存储。假设稍后您将'List 图像'更改为'Map id2image'。然后'hasImage'将被缩减为'return id2image.containsKey(idImage);' – 2015-08-30 09:36:12

下面是一些基本的理念:

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    List<Review> reviews = new ArrayList<>(); 
    for(int i = 0; i < 50; i++) { 
     List<RelReviewImage> revImg = new ArrayList<>(); 
     for(int j = 0; j < 5; j++) { 
      revImg.add(new RelReviewImage(j, j, "img_"+j)); 
     } 
     reviews.add(new Review(i, "rev" + i, revImg)); 
    } 

    List<Review> result = reviews.stream().filter(r -> r.getImages().stream().anyMatch(i -> i.getIdImage().intValue() < 2)).collect(Collectors.toList()); 

} 

public class Review { 
    private Integer idReview; 
    private String description; 
    private List<RelReviewImage> images; 

    public Review(Integer id, String desc, List<RelReviewImage> img) { 
     super(); 
     this.idReview = id; 
     this.description = desc; 
     this.images = img; 
    } 

    public Integer getIdReview() { 
     return idReview; 
    } 

    public void setIdReview(Integer idReview) { 
     this.idReview = idReview; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public List<RelReviewImage> getImages() { 
     return images; 
    } 

    public void setImages(List<RelReviewImage> images) { 
     this.images = images; 
    } 
} 

public class RelReviewImage { 
    private Integer idRelReviewImage; 
    private Integer idImage; 
    private String name; 

    public RelReviewImage(Integer id, Integer id_img, String name) { 
     super(); 
     this.idRelReviewImage = id; 
     this.idImage = id_img; 
     this.name = name; 
    } 

    public Integer getIdRelReviewImage() { 
     return idRelReviewImage; 
    } 

    public void setIdRelReviewImage(Integer idRelReviewImage) { 
     this.idRelReviewImage = idRelReviewImage; 
    } 

    public Integer getIdImage() { 
     return idImage; 
    } 

    public void setIdImage(Integer idImage) { 
     this.idImage = idImage; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 
+0

尽管这段代码可能会回答这个问题,但提供关于如何解决问题和/或为什么解决问题的额外上下文会提高答案的长期价值。 – 2017-01-12 13:04:36