List, Map, Set的联想-简化书写

来源:互联网 发布:淘宝中老年女装 编辑:程序博客网 时间:2024/05/19 13:17

最近在搞3G的研究, 发现android的java代码中有这样三个类Lists, Maps, Sets. 这让我想到和大家分享

首先以前我们写的泛型类List<Integer> list = new ArrayList<Integer>();

显然右边的泛型和左面一样, 能不能不写. 在7月要发版的jdk1.7中有菱形语法

List<Integer> list = new ArrayList<>(); , 但这在1.7之前的所有jdk中都不支持. 能不能有一种

办法可以在之前的所有jdk中不写右边的泛型, 而且没有警告. 看看Lists这个类吧

public class Lists {

    /**
     * Creates an empty
{@code ArrayList} instance.
     *
     * <p><b>Note:</b> if you only need an <i>immutable</i> empty List, use
     *
{@link Collections#emptyList} instead.
     *
     * @return a newly-created, initially-empty
{@code ArrayList}
     */
    public static <E> ArrayList<E> newArrayList() {
        return new ArrayList<E>();
    }

显然当我们调用时, 只要  List<Integer> list = Lists.newArrayList(); 在这个方法内部的泛型已经传入类型, 而且代码比直接new

还要短.

以下贴出代码:

Lists:

import java.util.ArrayList;
import java.util.Collections;

/**
 * Provides static methods for creating {@code List} instances easily, and other
 * utility methods for working with lists.
 */
public class Lists {

    /**
     * Creates an empty {@code ArrayList} instance.
     *
     * <p><b>Note:</b> if you only need an <i>immutable</i> empty List, use
     * {@link Collections#emptyList} instead.
     *
     * @return a newly-created, initially-empty {@code ArrayList}
     */
    public static <E> ArrayList<E> newArrayList() {
        return new ArrayList<E>();
    }

    /**
     * Creates a resizable {@code ArrayList} instance containing the given
     * elements.
     *
     * <p><b>Note:</b> due to a bug in javac 1.5.0_06, we cannot support the
     * following:
     *
     * <p>{@code List<Base> list = Lists.newArrayList(sub1, sub2);}
     *
     * <p>where {@code sub1} and {@code sub2} are references to subtypes of
     * {@code Base}, not of {@code Base} itself. To get around this, you must
     * use:
     *
     * <p>{@code List<Base> list = Lists.<Base>newArrayList(sub1, sub2);}
     *
     * @param elements the elements that the list should contain, in order
     * @return a newly-created {@code ArrayList} containing those elements
     */
    public static <E> ArrayList<E> newArrayList(E... elements) {
        int capacity = (elements.length * 110) / 100 + 5;
        ArrayList<E> list = new ArrayList<E>(capacity);
        Collections.addAll(list, elements);
        return list;
    }
}

Maps:

import java.util.HashMap;

/**
 * Provides static methods for creating mutable
{@code Maps} instances easily.
 */
public class Maps {
    /**
     * Creates a
{@code HashMap} instance.
     *
     * @return a newly-created, initially-empty
{@code HashMap}
     */
    public static <K, V> HashMap<K, V> newHashMap() {
        return new HashMap<K, V>();
    }
}

Sets:

/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed 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 com.google.android.collect;

import java.util.Collections;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.SortedSet;
import java.util.TreeSet;

/**
 * Provides static methods for creating mutable
{@code Set} instances easily and
 * other static methods for working with Sets.
 *
 */
public class Sets {
   
    /**
     * Creates an empty
{@code HashSet} instance.
     *
     * <p><b>Note:</b> if
{@code E} is an {@link Enum} type, use {@link
     * EnumSet#noneOf} instead.
     *
     * <p><b>Note:</b> if you only need an <i>immutable</i> empty Set,
     * use
{@link Collections#emptySet} instead.
     *
     * @return a newly-created, initially-empty
{@code HashSet}
     */
    public static <K> HashSet<K> newHashSet() {
        return new HashSet<K>();
    }

    /**
     * Creates a
{@code HashSet} instance containing the given elements.
     *
     * <p><b>Note:</b> due to a bug in javac 1.5.0_06, we cannot support the
     * following:
     *
     * <p>{@code Set<Base> set = Sets.newHashSet(sub1, sub2);}
     *
     * <p>where
{@code sub1} and {@code sub2} are references to subtypes of {@code
     * Base}, not of {@code Base} itself. To get around this, you must use:
     *
     * <p>{@code Set<Base> set = Sets.<Base>newHashSet(sub1, sub2);}
     *
     * @param elements the elements that the set should contain
     * @return a newly-created
{@code HashSet} containing those elements (minus
     *     duplicates)
     */
    public static <E> HashSet<E> newHashSet(E... elements) {
        int capacity = elements.length * 4 / 3 + 1;
        HashSet<E> set = new HashSet<E>(capacity);
        Collections.addAll(set, elements);
        return set;
    }

    /**
     * Creates an empty
{@code SortedSet} instance.
     *
     * @return a newly-created, initially-empty
{@code SortedSet}.
     */
    public static <E> SortedSet<E> newSortedSet() {
        return new TreeSet<E>();
    }

    /**
     * Creates a
{@code SortedSet} instance containing the given elements.
     *
     * @param elements the elements that the set should contain
     * @return a newly-created
{@code SortedSet} containing those elements (minus
     *     duplicates)
     */
    public static <E> SortedSet<E> newSortedSet(E... elements) {
        SortedSet<E> set = new TreeSet<E>();
        Collections.addAll(set, elements);
        return set;
    }

}

原创粉丝点击