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.
你需要的是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)
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |