在构造函数中使用Map参数

时间:2015-05-19 08:30:53

标签: java

我有一个带有此构造函数的类Student

 public Student(String name, int age, Map<String, Integer> grades) {
    this.setName(name);
    this.setAge(age);
    this.setGrades(grades);
 }

创建Student对象时,如何在构造函数中传递Map参数?

我们正在寻找的是类似的东西:

List<Student> roster = new ArrayList<>();
roster.add(new Student("Ann Droid", 145, Arrays.asList(96, 78)));

如果我有这个构造函数:

public Student(String name, int age, List<Integer> grades) {
    this.setName(name);
    this.setAge(age);
    this.setGrades(grades);
 }

5 个答案:

答案 0 :(得分:5)

Vanilla flavour plain Java对于地图Arrays.asList()没有任何帮助。因此,您必须在以下几行代码中初始化Map

Map<String, Integer> grades = new HashMap<String, Integer>();
grades.put("English", 90);
roster.add(new Student("Ann Droid", 145, grades);

但是,使用Google的番石榴,您可以这样做:

Map<String, Integer> grades = ImmutableMap.of("English", 90);

答案 1 :(得分:3)

使用单个衬垫无法完成。

Map<String,Integer> grades = new HashMap<>();
grades.put("Math", 100);
roster.add(new Student("Ann Droid", 145, grades));

答案 2 :(得分:3)

无法使用Java&lt; = 7并使用标准JDK在单行中创建Map。 (从技术上讲,你可以使用双支撑初始化器,但它被认为是一种不好的做法)。

在Java 8中,您可以使用Stream API来实现此目的:

import java.util.AbstractMap.SimpleEntry;
import java.util.stream.Stream;
import static java.util.stream.Collectors.toMap;

...
new Student("Name", 
            10,
            Stream.of(new SimpleEntry<>("MyString", 1), 
                      new SimpleEntry<>("AnotherString", 2))
                  .collect(toMap(SimpleEntry::getKey, SimpleEntry::getValue)));

现在你必须看看它是否提高了你的用例的可读性;)

或者您可以修改您的设计,以便Map<String, Integer>代表List<Grade>代表,每个Grade代表课程String和{{1}这个课程的学生成绩。

然后你可以使用Integer

Arrays.asList

当然,你必须确保成绩的独特性。

答案 3 :(得分:3)

您可以自己制作实用功能。但是,它不是非常类型安全的,因为你需要绕过打字来(ab)使用varags参数。

public class MapExample
{
    public static <K, V> Map<K, V> map(Object... objects)
    {
        Map<K, V> map = new HashMap<>();
        for (int n = 0; n < objects.length; n += 2)
        {
            map.put((K)objects[n], (V)objects[n + 1]);
        }
        return map;
    }

    public static void main(String[] args)
    {
        System.out.println(map("AAA", 123, "BBB", 456));
    }
}

答案 4 :(得分:1)

您可以使用anonymous constructor

尝试此选项
List<Student> roster = new ArrayList<Student>();
roster.add(new Student("Ann Droid", 145, new HashMap<String, Integer>(){{
                                         put("English", 78);
                                         put("Math", 96);
                                         }}));

或者您可以使用Guava ImmutableMap of(),但此API仅限五对。

List<Student> roster = new ArrayList<>();
roster.add(new Student("Ann Droid", 145, ImmutableMap.of("English", 78, "Math", 96);