嵌套在Lambdas中设置块迭代和范围

sat*_*son -1 java lambda java-8

希望有人能解决这个问题.,

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

主要对象是学生,学生得到一些信件

 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图让lambda根据过滤条件返回所有学生(最外面的对象列表).我知道我们可以迭代旧的方式,但我想看看是否有一个lambda可以帮助我.TIA.

Swe*_*per 6

你需要的是2张平面地图:

Set<LetterRange> rangeOfLetters = studentList.stream()
        .flatMap(x -> x.letterSet.stream())
        .flatMap(x -> x.letterRanges.stream())
        .collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

平面地图操作可以转为:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Run Code Online (Sandbox Code Playgroud)

进入这个:

[1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

您的数据结构如下:

[
    <
        {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}
    >
]
Run Code Online (Sandbox Code Playgroud)

[]表示最外层的集.该<>代表学生对象和{}代表字母对象.

第一个平面地图将数据转换为:

    [
        {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}
    ]
Run Code Online (Sandbox Code Playgroud)

第二张平面地图将数据转换为:

[
    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
]
Run Code Online (Sandbox Code Playgroud)