Java Lambdas中的嵌套集块迭代和范围

Java Lambdas中的嵌套集块迭代和范围,java,lambda,java-8,Java,Lambda,Java 8,希望有人能解决这个问题 对象结构我有一个类似的对象结构 主要对象是学生,学生得到一些字母 public class LetterRange { private Date letterStartDate; private Date letterEndDate; public Date getLetterStartDate() { return letterStartDate; } public void setLetterStartDa

希望有人能解决这个问题

对象结构我有一个类似的对象结构

主要对象是学生,学生得到一些字母

 public class LetterRange {
    private Date letterStartDate;
    private Date letterEndDate;

    public Date getLetterStartDate() {
        return letterStartDate;
    }

    public void setLetterStartDate(Date letterStartDate) {
        this.letterStartDate = letterStartDate;
    }

    public Date getLetterEndDate() {
        return letterEndDate;
    }

    public void setLetterEndDate(Date letterEndDate) {
        this.letterEndDate = letterEndDate;
    }
}

public class Letters {
    private String letterName;
    private Set<LetterRange> letterRangeSet;

    public String getLetterName() {
        return letterName;
    }

    public void setLetterName(String letterName) {
        this.letterName = letterName;
    }

    public Set<LetterRange> getLetterRangeSet() {
        return letterRangeSet;
    }

    public void setLetterRangeSet(Set<LetterRange> letterRangeSet) {
        this.letterRangeSet = letterRangeSet;
    }
}

public class Student {
    private String name;
    Set<Letters> lettersSet;

    public String getName() {
        return name;
    }

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

    public Set<Letters> getLettersSet() {
        return lettersSet;
    }

    public void setLettersSet(Set<Letters> lettersSet) {
        this.lettersSet = lettersSet;
    }
}
public class StudentRunner {
    public static void main(String args[]){
    List<Student> studentList = new ArrayList<>();
    Student one = new Student();
    Student two= new Student();
    Student three= new Student();
    one.setName("John");

    Letters johnLetter1 = new Letters();
    johnLetter1.setLetterName("Kudos");

    Letters janeLetter = new Letters();
    janeLetter.setLetterName("Jane Kudos");

    Letters otherJaneLetter = new Letters();
    otherJaneLetter.setLetterName("Other Jane letter");


    one.setLettersSet(new HashSet<Letters>() {{
        add(johnLetter1);
        add(janeLetter);
        add(otherJaneLetter);
    }});

    two.setLettersSet(new HashSet<Letters>(){{
        add(johnLetter1);
        add(janeLetter);
    }});

    LetterRange johnLetter1Range = new LetterRange();
    johnLetter1Range.setLetterStartDate(new Date());
    johnLetter1Range.setLetterEndDate(new Date());

    LetterRange johnLetter2Range = new LetterRange();
    johnLetter1Range.setLetterStartDate(DateTime.now().plus(10).toDate());
    johnLetter1Range.setLetterEndDate(DateTime.now().plus(10).toDate());

    johnLetter1.setLetterRangeSet(new HashSet<LetterRange>() {{
        add(johnLetter1Range);
        add(johnLetter2Range);
    }});

    studentList.add(one);

    Set dataSet = studentList.stream().flatMap(student -> student.getLettersSet().stream())
            .collect(Collectors.toSet());


   Letters dataMap= studentList.stream().flatMap(student -> student.getLettersSet().stream()).filter(letters -> StringUtils.contains(letters.getLetterName(),"Jane")).findAny().orElseThrow(
        NoSuchElementException::new);
    System.out.println(dataMap);
    System.out.println(studentList.stream().flatMap(student -> student.getLettersSet().stream()).filter(letters -> StringUtils.contains(letters.getLetterName(),"Jane")).collect(Collectors.toSet()));
    Assert.assertTrue(dataSet.size() == 1);
    }
}
公共类字母范围{
私人日期信开始日期;
私人日期letterEndDate;
公开日期getLetterStartDate(){
返回信开始日期;
}
公共无效设置letterStartDate(日期letterStartDate){
this.letterStartDate=letterStartDate;
}
公共日期getLetterEndDate(){
返回日期;
}
公共无效设置letterEndDate(日期letterEndDate){
this.letterEndDate=letterEndDate;
}
}
公函{
私有字符串字母名;
私人套装;
公共字符串getLetterName(){
返回字母名称;
}
public void setLetterName(字符串letterName){
this.letterName=letterName;
}
公共集getLetterRangeSet(){
返回字母范围集;
}
公共无效集合letterRangeSet(集合letterRangeSet){
this.letterRangeSet=letterRangeSet;
}
}
公立班学生{
私有字符串名称;
设置字母集合;
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共集getLettersSet(){
回信集;
}
公共无效集合字母集合(集合字母集合){
this.lettersSet=lettersSet;
}
}
公共班级学生跑步者{
公共静态void main(字符串参数[]){
List studentList=new ArrayList();
学生一=新学生();
学生二=新学生();
学生三=新学生();
一、设置名称(“约翰”);
字母johnLetter1=新字母();
johnLetter1.setLetterName(“荣誉”);
字母janeLetter=新字母();
janeLetter.setLetterName(“Jane Kudos”);
字母=新字母();
otherJaneLetter.setLetterName(“otherJaneLetter”);
1.setLettersSet(新的HashSet(){{
添加(johnLetter1);
加(信);
加上(其他字母);
}});
2.setLettersSet(新HashSet(){{
添加(johnLetter1);
加(信);
}});
LetterRange johnLetter1Range=新的LetterRange();
johnLetter1Range.setLetterStartDate(新日期());
johnLetter1Range.setLetterEndDate(新日期());
LetterRange johnLetter2Range=新的LetterRange();
johnLetter1Range.setLetterStartDate(DateTime.now().plus(10.toDate());
johnLetter1Range.setLetterEndDate(DateTime.now().plus(10.toDate());
johnLetter1.setLetterRangeSet(新的HashSet(){{
添加(johnletter1范围);
添加(johnletter2范围);
}});
学生名单。添加(一);
Set dataSet=studentList.stream().flatMap(student->student.getletsset().stream())
.collect(收集器.toSet());
Letters dataMap=studentList.stream().flatMap(student->student.getletsset().stream()).filter(Letters->StringUtils.contains(Letters.getLetterName(),“Jane”).findAny().orelsetrow(
NoSuchElementException::new);
System.out.println(数据映射);
System.out.println(studentList.stream().flatMap(student->student.getletsset().stream()).filter(letters->StringUtils.contains(letters.getletlettername(),“Jane”).collect(Collectors.toSet());
Assert.assertTrue(dataSet.size()==1);
}
}

我在尝试获取lambda以根据筛选条件返回所有学生(最外面的对象列表)时陷入困境。我知道我们可以用普通的老方法迭代,但我想看看是否有lambda可以帮助我。TIA.

您需要的是两张平面图:

Set<LetterRange> rangeOfLetters = studentList.stream()
        .flatMap(x -> x.letterSet.stream())
        .flatMap(x -> x.letterRanges.stream())
        .collect(Collectors.toSet());
为此:

[1, 2, 3, 4, 5, 6, 7, 8, 9]
    [
        {LetterRange, LetterRange, LetterRange},
        {LetterRange, LetterRange, LetterRange},
        {LetterRange, LetterRange, LetterRange},
        {LetterRange, LetterRange, LetterRange},
        {LetterRange, LetterRange, LetterRange},
        {LetterRange, LetterRange, LetterRange},
        {LetterRange, LetterRange, LetterRange},
        {LetterRange, LetterRange, LetterRange},
        {LetterRange, LetterRange, LetterRange}
    ]
您的数据结构如下所示:

[
    <
        {LetterRange, LetterRange, LetterRange},
        {LetterRange, LetterRange, LetterRange},
        {LetterRange, LetterRange, LetterRange}
    >,
    <
        {LetterRange, LetterRange, LetterRange},
        {LetterRange, LetterRange, LetterRange},
        {LetterRange, LetterRange, LetterRange}
    >,
    <
        {LetterRange, LetterRange, LetterRange},
        {LetterRange, LetterRange, LetterRange},
        {LetterRange, LetterRange, LetterRange}
    >
]
第二张平面图将数据转换为:

[
    LetterRange, LetterRange, LetterRange,
    LetterRange, LetterRange, LetterRange,
    LetterRange, LetterRange, LetterRange,
    LetterRange, LetterRange, LetterRange,
    LetterRange, LetterRange, LetterRange,
    LetterRange, LetterRange, LetterRange,
    LetterRange, LetterRange, LetterRange,
    LetterRange, LetterRange, LetterRange,
    LetterRange, LetterRange, LetterRange
]

解决这个问题的一种方法是使用中间变量,看看在每个阶段都得到了什么

Stream<Student> studentStream = studentList.stream();
向目标靠拢基本上与以前的思路相同:

Stream<LetterRange> letterRangeStream = lettersStream.flatMap(
     ls -> ls.getLetterRangeSet().stream());
您可以这样选择:

    Stream<Student> studentStream = studentList.stream();
    Stream<Letters> lettersStream = studentStream.flatMap(
          stu -> stu.getLettersSet().stream());
    Stream<LetterRange> letterRangeStream = lettersStream.flatMap(
          ls -> ls.getLetterRangeSet().stream());
    List<LetterRange> letterRanges = letterRangeStream.collect(Collectors.toList());
Stream studentStream=studentList.Stream();
流字母Stream=studentStream.flatMap(
stu->stu.getletsset().stream());
Stream letterRangeStream=lettersStream.flatMap(
ls->ls.getLetterRangeSet().stream());
List letterRanges=letterRangeStream.collect(Collectors.toList());
。。。这很好——不管怎样,JRE都会优化中间变量。但如果您愿意,可以将它们内联(手动或使用IDE的“内联变量”重构工具)以:

List letterRanges=studentList.stream()
.flatMap(stu->stu.getLettersSet().stream())
.flatMap(ls->ls.getLetterRangeSet().stream())
.collect(Collectors.toList());

将psuedo稍作更改。谢谢。请让我复制粘贴代码。只需几分钟。更新它。你真的复制粘贴了这个代码吗?代码中有多个明显的错误!(例如,“类”而不是“类”)Ty.,现在有实际的代码了。被39秒打败了我错过了做平面图的部分,因为它更平坦了。我被困在试图重新调整内联代码以保持简单。谢谢
Stream<LetterRange> letterRangeStream = lettersStream.flatMap(
     ls -> ls.getLetterRangeSet().stream());
List<LetterRange> letterRanges = letterRangeStream.collect(Collectors.toList());
    Stream<Student> studentStream = studentList.stream();
    Stream<Letters> lettersStream = studentStream.flatMap(
          stu -> stu.getLettersSet().stream());
    Stream<LetterRange> letterRangeStream = lettersStream.flatMap(
          ls -> ls.getLetterRangeSet().stream());
    List<LetterRange> letterRanges = letterRangeStream.collect(Collectors.toList());
List<LetterRange> letterRanges = studentList.stream()
   .flatMap(stu -> stu.getLettersSet().stream())
   .flatMap(ls -> ls.getLetterRangeSet().stream())
   .collect(Collectors.toList());