Hier sind drei verschiedene Lösungen für dieses Problem. Jede Lösung filtert zuerst leere Zeichenfolgen, da andernfalls StringIndexOutOfBoundsException
ausgelöst werden kann.
Diese Lösung ist die gleiche wie die Lösung von Tagir mit dem hinzugefügten Code zum Filtern leerer Strings. Ich habe es hier hauptsächlich aufgenommen, um es mit den anderen beiden Lösungen zu vergleichen, die ich zur Verfügung gestellt habe.
List<String> list =
Arrays.asList("the", "", "quick", "", "brown", "", "fox");
StringBuilder builder = list.stream()
.filter(s -> !s.isEmpty())
.mapToInt(s -> s.codePointAt(0))
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append);
String result = builder.toString();
Assert.assertEquals("tqbf", result);
Die zweite Lösung verwendet Eclipse Collections, und nutzt einen relativ neuen Containertyp namens CodePointAdapter
, die in Version 7.0 hinzugefügt wurde.
MutableList<String> list =
Lists.mutable.with("the", "", "quick", "", "brown", "", "fox");
LazyIntIterable iterable = list.asLazy()
.reject(String::isEmpty)
.collectInt(s -> s.codePointAt(0));
String result = CodePointAdapter.from(iterable).toString();
Assert.assertEquals("tqbf", result);
Die dritte Lösung nutzt Eclipse-Kollektionen wieder, aber mit injectInto
und StringBuilder
statt CodePointAdapter
.
MutableList<String> list =
Lists.mutable.with("the", "", "quick", "", "brown", "", "fox");
StringBuilder builder = list.asLazy()
.reject(String::isEmpty)
.collectInt(s -> s.codePointAt(0))
.injectInto(new StringBuilder(), StringBuilder::appendCodePoint);
String result = builder.toString();
Assert.assertEquals("tqbf", result);
Hinweis: Ich bin ein Committer für Eclipse Collections.
Setzt dies nur das erste Zeichen jedes Strings an? – SamTebbs33
@ SamTebbs33: Whoops, nicht. Wird reparieren. –