我有一个带有此构造函数的类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);
}
答案 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)
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);