我想从特定键的属性创建值的集合。该方法以这种方式工作:
Collection<String> getValueOfKey(final Collection<Localization> input, final String key) {
return input.stream().map(l -> {
return l.getProperties();
}).map(p -> {
return p.getProperty(key, "");
}).collect(Collectors.toList());
}
首先,我想使用Collectors.toSet()
而不是,Collectors.toList()
但结果却是错误的(它只是给了我来自的价值en
)。有人知道我为什么不能使用.toSet()
吗?
这是我的TestCode:
public class RowCreatorTest {
private final Properties fixturePropertieDe = new Properties();
private final Properties fixturePropertieEn = new Properties();
private final Localization de = new Localization(Languages.GERMAN, fixturePropertieDe);
private final Localization en = new Localization(Languages.ENGLISH, fixturePropertieEn);
private final RowCreator sut = new RowCreator();
@Before
public void prepareFixtures() {
fixturePropertieDe.put("key1", "foo1");
fixturePropertieDe.put("key3", "foo3");
fixturePropertieEn.put("key1", "bar1");
fixturePropertieEn.put("key2", "bar2");
}
@Test
public void getValueOfKey() {
assertThat(sut.getValueOfKey(Arrays.asList(de, en), "key1"), contains("foo1", "bar1"));
assertThat(sut.getValueOfKey(Arrays.asList(de, en), "key2"), contains("", "bar2"));
assertThat(sut.getValueOfKey(Arrays.asList(de, en), "key3"), contains("foo3", ""));
}
根据您所发布的错误的链接(expected iterable containing ["foo1","bar1"] but item 0 was "bar1"
),断言期望这两个值以指定的顺序显示(第一个为“ foo1”,然后为“ bar1”),但是Set
不保持顺序,并且“ bar1”首先出现在上进行迭代时Set
,因此断言失败。
因此,问题出在断言中,而不是在使用中toSet()
。
Set
例如,如果您使用LinkedHashSet
(替换toSet()
为toCollection(LinkedHashSet::new)
),则可以根据插入顺序强制对进行迭代。这样可以确保断言不会失败。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句