java StringJoiner
Для сборки текста мы использовали StringJoiner, или StringBuilder. Стримы также позволяют сложить элементы, если они являются строками, в единый текст. Для этого используется метод collect() и Collectors.joining(). Метод joining() принимает те же аргументы, что и StringJoiner
Ваша задача собрать строки списка в текст и добавить префикс "Prefix", и суффикc "Suffix"(т.е. нужно использовать перегруженный вариант joining()). Разделителем должен быть System.lineSeparator()
мой код:
public class JoiningMethod {
public static String join(List<String> strings) {
return List.of(strings.toString())
.stream()
.collect(Collectors.joining("Prefix","Suffix"));
}
}
тест:
public class JoiningMethodTest { @Test public void test() { StringJoiner expect = new StringJoiner( System.lineSeparator(), "Prefix", "Suffix" ); expect.add("A"); expect.add("B"); expect.add("C"); assertEquals( expect.toString(), JoiningMethod.join(List.of( "A", "B", "C" )) ); } }
ошибка:
java.lang.AssertionError: expected [[[A, B, C]]] but found [PrefixA
B
CSuffix]
at org.testng.Assert.fail(Assert.java:93)
at org.testng.Assert.failNotEquals(Assert.java:512)
at org.testng.Assert.assertEqualsImpl(Assert.java:134)
at org.testng.Assert.assertEquals(Assert.java:115)
at org.testng.Assert.assertEquals(Assert.java:189)
at org.testng.Assert.assertEquals(Assert.java:199)
at ru.job4j.sentence.JoiningMethodTest.test(JoiningMethodTest.java:23)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
помогите пожалуйста правильно написать код для решения задания.
Ответы (1 шт):
Во-первых, класс JoiningMethod не компилируется, так как не существует реализации Collectors.joining, принимающей 2(два) строковых аргумента -- пропущен делимитер для строк System.lineSeparator().
Также следует отметить, что в используемом варианте тестового фреймворка в методе assertThat первый аргумент - тестируемое значение (actual), а второй - ожидаемое (expected).
Во-вторых, метод JoiningMethod.join реализован некорректно: сначала входной список преобразуется в строку "[A, B, C]", затем создается иммутабельный список, включающий эту единственную строку, и затем при помощи Stream API генерируется результат. Поскольку строка одна, делимитер для строк не используется и добавляются только префикс и суффикс: "Prefix[A, B, C]Suffix".
Если нужно реализовать так же, как в StringJoiner, не нужно превращать исходный список в строку:
class JoiningMethod {
public static String join(List<String> strings) {
return strings
.stream()
.collect(Collectors.joining(
System.lineSeparator(), "Prefix", "Suffix"
));
}
}
В такой реализации результат будет аналогичный StringJoiner:
PrefixA
B
CSuffix