Java tutorial
/**************************************************************** * Licensed to the Apache Software Foundation (ASF) under one * * or more contributor license agreements. See the NOTICE file * * distributed with this work for additional information * * regarding copyright ownership. The ASF licenses this file * * to you under the Apache License, Version 2.0 (the * * "License"); you may not use this file except in compliance * * with the License. You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, * * software distributed under the License is distributed on an * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * * KIND, either express or implied. See the License for the * * specific language governing permissions and limitations * * under the License. * ****************************************************************/ package org.apache.james.util.streams; import java.util.ArrayList; import java.util.List; import java.util.function.Function; import java.util.stream.Collector; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; public class ImmutableCollectors { public static <T> Collector<T, List<T>, ImmutableList<T>> toImmutableList() { return Collector.of(ArrayList::new, List::add, (left, right) -> { left.addAll(right); return left; }, ImmutableList::copyOf); } public static <T> Collector<T, ImmutableSet.Builder<T>, ImmutableSet<T>> toImmutableSet() { return Collector.of(ImmutableSet::builder, ImmutableSet.Builder::add, (left, right) -> { left.addAll(right.build()); return left; }, ImmutableSet.Builder::build); } public static <T, K, V> Collector<T, ImmutableMap.Builder<K, V>, ImmutableMap<K, V>> toImmutableMap( Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends V> valueMapper) { return Collector.of(ImmutableMap::<K, V>builder, (acc, v) -> acc.put(keyMapper.apply(v), valueMapper.apply(v)), (map1, map2) -> map1.putAll(map2.build()), ImmutableMap.Builder::build); } }