첫째, 오히려 Splitter#withKeyValueSeparator
(여기에 직접 Splitter.MapSplitter
사용하지만,하지 않습니다 Splitter.on('|').withKeyValueSeparator(':')
을 둘째, 귀하의 경우에 가장 효율적인 방법은 수동으로 분할 쌍과 술어 경우 (키에 대한 다음 분할 쌍 될 것입니다. == id)가 충족되지 않고 맨 끝까지지도를 만들지 않습니다.
TIMTOWDI,하지만 사용 사례에 유용한 방법이있는 jOOL을 사용하고 있습니다. Seq.seq(Iterable)
은 스트림을 만드는 간단한 도우미이며, 더 중요한 것은 Seq#limitUntilClosed(Predicate)
은 id
키가 발견 될 때까지 모든 값을 선택합니다 :
private static final Splitter PAIRS_SPLITTER = Splitter.on('|');
private static final Splitter KEY_VALUE_SPLITTER = Splitter.on(':');
private static final String INVALID_ENTRY_MESSAGE = "Chunk [%s] is not a valid entry";
private Map<String, String> homebrewMapSplitter(final String string)
{
return Seq.seq(PAIRS_SPLITTER.split(string))
.map(this::createEntry)
.limitUntilClosed(e -> e.getKey().equals("id"))
.collect(ImmutableMap.toImmutableMap(
Map.Entry::getKey,
Map.Entry::getValue)
);
}
// ~copied from MapSplitter#split(CharSequence)
private Map.Entry<String, String> createEntry(final String entry)
{
Iterator<String> entryFields = KEY_VALUE_SPLITTER.split(entry).iterator();
checkArgument(entryFields.hasNext(), INVALID_ENTRY_MESSAGE, entry);
String key = entryFields.next();
checkArgument(entryFields.hasNext(), INVALID_ENTRY_MESSAGE, entry);
String value = entryFields.next();
checkArgument(!entryFields.hasNext(), INVALID_ENTRY_MESSAGE, entry);
return Maps.immutableEntry(key, value);
}
"id 키까지"란 무엇을 의미합니까? "id"앞에 모든 키 - 값 쌍을 유지하고 나머지는 버리려고한다는 것을 의미합니까? –
예. 가장 효과적인 방법 위에 String에서 다음 매핑을 얻고 싶습니다. key1을 value1로, prop를 id로, key3을 value3으로, id를 ABC.CDE로 가져 오려고합니다. – AggregateException