为什么';t work.toSet()在Java中创建集合?
我想从特定键的属性创建一个值集合。这些方法的工作原理如下:为什么';t work.toSet()在Java中创建集合?,java,collections,Java,Collections,我想从特定键的属性创建一个值集合。这些方法的工作原理如下: Collection<String> getValueOfKey(final Collection<Localization> input, final String key) { return input.stream().map(l -> { return l.getProperties(); }).map(p -> {
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());
}
下面是测试内容的屏幕截图:基于您发布的错误链接(
预期iterable包含[“foo1”,“bar1”],但项目0是“bar1”
),断言预期两个值以指定顺序出现(首先是“foo1”,然后是“bar1”),但设置s不维护顺序,以及“bar1”在迭代集合时首先出现,因此断言失败
因此,问题在于断言,而不是使用toSet()
例如,如果使用LinkedHashSet
(将toSet()
替换为toCollection(LinkedHashSet::new)
),则可以根据插入顺序强制对集进行迭代。这将确保断言不会失败。使用Collectors.toSet()
肯定会生成集合:Collection set=new ArrayList().stream().collect(Collectors.toSet())代码>。其他地方有个问题。您能详细描述一下使用toSet()
时出现的问题吗?这三个断言都失败了?只有一个?我添加了一个测试失败的屏幕截图看起来更像你的问题是,你应该使用containsInAnyOrder
而不是contains
“砰砰的一声放在我桌上”哦!非常感谢。或者更好的是,使用而不是。
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", ""));
}