mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 08:14:09 -08:00
parent
03c70e3a06
commit
1785d6ad9e
|
@ -17,12 +17,16 @@ package org.teavm.classlib.java.util.stream;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.function.BiConsumer;
|
import java.util.function.BiConsumer;
|
||||||
import java.util.function.BinaryOperator;
|
import java.util.function.BinaryOperator;
|
||||||
|
import java.util.function.Function;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
import org.teavm.classlib.java.util.TObjects;
|
||||||
|
|
||||||
public final class TCollectors {
|
public final class TCollectors {
|
||||||
private TCollectors() {
|
private TCollectors() {
|
||||||
|
@ -69,4 +73,48 @@ public final class TCollectors {
|
||||||
return TCollector.of(StringBuilder::new, accumulator, combiner,
|
return TCollector.of(StringBuilder::new, accumulator, combiner,
|
||||||
sb -> sb.insert(0, prefix).append(suffix).toString());
|
sb -> sb.insert(0, prefix).append(suffix).toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static <E, K, V> TCollector<E, ?, Map<K, V>> toMap(Function<? super E, ? extends K> keyMapper,
|
||||||
|
Function<? super E, ? extends V> valueMapper) {
|
||||||
|
return TCollector.of(HashMap::new,
|
||||||
|
(map, el) -> {
|
||||||
|
K k = keyMapper.apply(el);
|
||||||
|
V newV = TObjects.requireNonNull(valueMapper.apply(el));
|
||||||
|
V oldV = map.putIfAbsent(k, newV);
|
||||||
|
if (oldV != null) {
|
||||||
|
throw new IllegalStateException(
|
||||||
|
"Key " + k + " corresponds to values " + oldV + " and " + newV);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
(m1, m2) -> {
|
||||||
|
for (Map.Entry<K, V> e : m2.entrySet()) {
|
||||||
|
V newV = TObjects.requireNonNull(e.getValue());
|
||||||
|
V oldV = m1.putIfAbsent(e.getKey(), newV);
|
||||||
|
if (oldV != null) {
|
||||||
|
throw new IllegalStateException(
|
||||||
|
"Key " + e.getKey() + " corresponds to values " + oldV + " and " + newV);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return m1;
|
||||||
|
},
|
||||||
|
TCollector.Characteristics.IDENTITY_FINISH);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <E, K, V> TCollector<E, ?, Map<K, V>> toMap(Function<? super E, ? extends K> keyMapper,
|
||||||
|
Function<? super E, ? extends V> valueMapper, BinaryOperator<V> mergeFunction) {
|
||||||
|
return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <E, K, V, M extends Map<K, V>> TCollector<E, ?, M> toMap(Function<? super E, ? extends K> keyMapper,
|
||||||
|
Function<? super E, ? extends V> valueMapper, BinaryOperator<V> mergeFunction, Supplier<M> mapFactory) {
|
||||||
|
return TCollector.of(mapFactory,
|
||||||
|
(map, el) -> map.merge(keyMapper.apply(el), valueMapper.apply(el), mergeFunction),
|
||||||
|
(m1, m2) -> {
|
||||||
|
for (Map.Entry<K, V> e : m2.entrySet()) {
|
||||||
|
m1.merge(e.getKey(), e.getValue(), mergeFunction);
|
||||||
|
}
|
||||||
|
return m1;
|
||||||
|
},
|
||||||
|
TCollector.Characteristics.IDENTITY_FINISH);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,9 +18,13 @@ package org.teavm.classlib.java.util.stream;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
@ -55,4 +59,23 @@ public class CollectorsTest {
|
||||||
Stream.of(1, 2, 3).collect(Collectors.toCollection(() -> c));
|
Stream.of(1, 2, 3).collect(Collectors.toCollection(() -> c));
|
||||||
assertEquals(Arrays.asList(1, 2, 3), c);
|
assertEquals(Arrays.asList(1, 2, 3), c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(expected = NullPointerException.class)
|
||||||
|
public void noNullsInToMap() {
|
||||||
|
Stream.of(1, 2, null).collect(Collectors.toMap(Function.identity(), Function.identity()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = IllegalStateException.class)
|
||||||
|
public void noDuplicatesInToMap() {
|
||||||
|
Stream.of(1, 2, 2).collect(Collectors.toMap(Function.identity(), Function.identity()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void toMap() {
|
||||||
|
Map<Integer, Integer> expected = new HashMap<>();
|
||||||
|
IntStream.range(1, 4).forEach(i -> expected.put(i, i));
|
||||||
|
|
||||||
|
assertEquals(expected,
|
||||||
|
IntStream.range(1, 4).boxed().collect(Collectors.toMap(Function.identity(), Function.identity())));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user