org.springframework.ide.eclipse.boot.dash.livexp.MapSet.java Source code

Java tutorial

Introduction

Here is the source code for org.springframework.ide.eclipse.boot.dash.livexp.MapSet.java

Source

/*******************************************************************************
 * Copyright (c) 2015 Pivotal, Inc.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Pivotal, Inc. - initial API and implementation
 *******************************************************************************/
package org.springframework.ide.eclipse.boot.dash.livexp;

import org.springsource.ide.eclipse.commons.livexp.core.ObservableSet;

import com.google.common.base.Function;
import com.google.common.collect.ImmutableSet;

/**
 * Represents a Set constructed by applying a function to each element of another
 * set.
 */
public class MapSet<S, T> extends ObservableSet<T> {

    private ObservableSet<S> input;
    private Function<S, T> function;

    public MapSet(ObservableSet<S> input, AsyncMode asyncRefresh, AsyncMode asyncEvents, Function<S, T> function) {
        super(ImmutableSet.<T>of(), asyncRefresh, asyncEvents);
        this.input = input;
        this.function = function;
        dependsOn(input);
    }

    /**
     * Deprecated. Use the constructor that explicitly allows choosing async versus sync behavior.
     */
    @Deprecated
    public MapSet(ObservableSet<S> input, Function<S, T> function) {
        this(input, AsyncMode.SYNC, AsyncMode.SYNC, function);
    }

    @Override
    protected ImmutableSet<T> compute() {
        ImmutableSet.Builder<T> builder = ImmutableSet.builder();
        for (S a : input.getValues()) {
            T v = function.apply(a);
            //Check for null, generally google collections don't allow nulls (which is good)
            // and we can take advantage of returning nulls to combine mapping and filtering with
            // a single function.
            if (v != null) {
                builder.add(v);
            }
        }
        return builder.build();
    }

}