首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要一些输入才能更好地使用Java-8编写代码

需要一些输入才能更好地使用Java-8编写代码
EN

Stack Overflow用户
提问于 2015-08-04 08:22:26
回答 2查看 80关注 0票数 2

我有一小部分代码(POJO)与java-8。我的问题是,我是否可以更好地使用java-8?我在课堂上提到了一些评论。

假设我有PersonStandardSubject pojos,并且也不担心equalshashCode方法,我只想要关于Java-8的输入。

代码语言:javascript
复制
package com.java8.learn.domain;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * @author Vishal.Zanzrukia
 *
 */
public class Teacher extends Person {

    private Map<Standard, Set<Subject>> standardWiseSubjects;

    public Map<Standard, Set<Subject>> getStandardWiseSubjects() {
        return standardWiseSubjects;
    }

    public void addStandardWiseSubject(Subject subject, Standard standard) {
        if (this.standardWiseSubjects == null) {
            this.standardWiseSubjects = new HashMap<>();
        }
        if (this.standardWiseSubjects.containsKey(standard)) {
            this.standardWiseSubjects.get(standard).add(subject);
        } else {
            Set<Subject> subjects = new HashSet<>();
            subjects.add(subject);
            this.standardWiseSubjects.put(standard, subjects);
        }
    }

    // I need some inputs over here.
    public Map<Subject, Set<Standard>> getSubjectWiseStandards() {

        if (this.standardWiseSubjects == null) {
            return null;
        }

        Map<Subject, Set<Standard>> output = new HashMap<>();

        this.standardWiseSubjects.values().parallelStream().flatMap(set -> set.stream()).forEach(subject -> {
            Set<Standard> standards = new HashSet<>();
            this.standardWiseSubjects.forEach((standard, subjects) -> {
                // TODO can I convert this if condition into predicate?
                if (subjects.contains(subject)) {
                    standards.add(standard);
                }
            });
            output.put(subject, standards);
        });

        return output;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-04 10:39:19

可以使用addStandardWiseSubject方法简化computeIfAbsent方法:

代码语言:javascript
复制
public void addStandardWiseSubject(Subject subject, Standard standard) {
    if (this.standardWiseSubjects == null) {
        this.standardWiseSubjects = new HashMap<>();
    }
    this.standardWiseSubjects.computeIfAbsent(standard,
            s -> new HashSet<>()).add(subject);
}

getSubjectWiseStandards()要复杂得多:你需要倒转地图。可以生成所有主题的中间对和相应的标准(我使用AbstractMap.SimpleEntry类来表示这种对):

代码语言:javascript
复制
public Map<Subject, Set<Standard>> getSubjectWiseStandards() {
    if (this.standardWiseSubjects == null) {
        return null;
    }

    return this.standardWiseSubjects.entrySet().parallelStream()
        .<Map.Entry<Subject, Standard>> flatMap(
                e -> e.getValue().stream()
                    .map(st -> new AbstractMap.SimpleEntry<>(st, e.getKey())))
        .collect(Collectors.groupingBy(e -> e.getKey(), 
                 Collectors.mapping(e -> e.getValue(), 
                 Collectors.toSet())));
}

使用我的EntryStream库的StreamEx类,这看起来可能更简单:

代码语言:javascript
复制
public Map<Subject, Set<Standard>> getSubjectWiseStandards() {
    if (this.standardWiseSubjects == null) {
        return null;
    }

    return EntryStream.of(this.standardWiseSubjects).parallel()
            .invert().flatMapKeys(Set::stream).groupingTo(HashSet::new);
}

请注意,具有并行流的forEach应该非常小心地使用,因为它可以并行地执行不同的元素。您的解决方案在修改来自此HashMap操作的forEach (这不是线程安全的)时可能不正确。

票数 2
EN

Stack Overflow用户

发布于 2015-08-04 16:00:34

应该是可能的,如下所示

代码语言:javascript
复制
Map<Standard, Set<Subject>> map = new HashMap<Standard, Set<Subject>>();
Map<Subject, Set<Standard>> reverseMap = new HashMap<Subject, Set<Standard>>();
HashSet<Subject> std1Subjects = new HashSet<Subject>();
std1Subjects.add(new Subject("English"));
std1Subjects.add(new Subject("Maths"));
std1Subjects.add(new Subject("Science"));

HashSet<Subject> std2Subjects = new HashSet<Subject>();
std2Subjects.add(new Subject("Hindi"));
std2Subjects.add(new Subject("Gujarati"));
std2Subjects.add(new Subject("Maths"));

HashSet<Subject> std3Subjects = new HashSet<Subject>();
std3Subjects.add(new Subject("Sanskrit"));
std3Subjects.add(new Subject("Science"));
std3Subjects.add(new Subject("Maths"));

map.put(new Standard("1"), std1Subjects);
map.put(new Standard("2"), std2Subjects);
map.put(new Standard("3"), std3Subjects);

//1.
map.keySet().forEach((std) -> map.get(std).forEach((sub)->{
    if(reverseMap.containsKey(sub)){
        reverseMap.get(sub).add(std);
    }else{
        HashSet<Standard> standardSet = new HashSet<Standard>();
        standardSet.add(std);
        reverseMap.put(sub, standardSet);
    }
}));

reverseMap
        .forEach((k, v) -> System.out.println("k-" + k + " , v-" + v));

也像下面这样

代码语言:javascript
复制
map.keySet().forEach((std) -> map.get(std).forEach((sub)->{
            reverseMap.computeIfAbsent(sub,standard-> new HashSet<>()).add(std);
            reverseMap.computeIfPresent(sub, (subject,stdSet) -> reverseMap.get(subject)).add(std);
        }));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31804201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档