如今,在功能上大肆宣传,因此至少在Java集合方面,我将简要介绍一下其中的功能。 我个人喜欢标准
集合API,但在某些情况下可能会很尴尬并添加其他详细信息。 在Java 8+的更高版本中,这应该不是问题。 在那里,我们可能会担心不会创建回调地狱,但嘿,对于大多数内容来说,没有万灵药,为什么要为编程编写一个?

番石榴之路

Guava项目是Google的核心库之一,其中涵盖了许多不同的核心语言方面和问题。 有日常使用的实用程序和扩展,例如:集合,基元,缓存,通用批注,字符串处理,I / O,数学,反射等。 我们只会看一下Collections的好东西,所以让我们看看其中的一些:

// list
    ImmutableList<String> of =
        ImmutableList.of("a", "b", "c", "d");
    // Same one for map
    ImmutableMap<String, String> map =
         ImmutableMap.of("key1", "value1", "key2", "value2");
    //list of ints
    List<Integer> theList = Ints.asList(1, 2, 3, 4, 522, 5, 6);

Guava集合与JDK集合兼容,因为它们主要扩展或实现标准类。 API中有几个很酷的实用程序,它们的名称与java.util.Collections中的名称相似。 基本上,任何了解JDK集合的程序员都应该能够轻松地转移到Guava。 用于List的那些称为Lists ,用于Set的一个称为Sets,用于Map的一个Maps ,其余的依次类推。 例如:

//create new List
List<someLongName> list = Lists.newArrayList();
//create new  LinkedHashMap
Map<someKeyType, SomeValueType> map = Maps.newLinkedHashMap();

//initalize Array List on the spot
List<String> someList = Lists.newArrayList("one", "two", "three");

//set inital size for readability as well as performance
List<Type> exactly100 = Lists.newArrayListWithCapacity(100);
List<Type> approx100 = Lists.newArrayListWithExpectedSize(100);

对应于特定界面的方法以非常直观的方式进行分组。 还有一些非常好的构建具有各种功能的缓存的方法:

Cache<Integer, Customer> cache = CacheBuilder.newBuilder()
        .weakKeys()
        .maximumSize(10000)
        .expireAfterWrite(10, TimeUnit.MINUTES)
        .build(new CacheLoader<Integer, Customer>() {

          @Override
          public Customer load(Integer key) throws Exception {

            return retreveCustomerForKey(key);
          }
        });

由于Guava在大多数Maven存储库中都可用,因此很容易将其添加到构建中

兰伯达

该项目背后的想法是以一种功能性和静态类型的方式来操纵集合。 这是通过避免重复通常用集合执行的简单任务来实现的。 重复使程序员可以复制/粘贴,并通过创建来创建bug。 在没有显式循环的情况下访问集合提供了一种过滤,排序,提取,分组,转换,调用每个项目上的方法或汇总集合中这些元素的元素或字段的方法。 除了所有这些功能之外,lambdaj还是DSL,因为它在语法中添加了非常酷的“糖”功能,使其在伪英语中更具可读性。 这是通过静态方法完成的,因此为了使用它们,我们直接将它们包括在内:

import static ch.lambdaj.Lambda.*;

在检查和匹配方面,lambdaj高度依赖Hamcrest匹配器。 因此,例如,创建一个奇数整数检查,然后使用该检查过滤列表:

Matcher<Integer> odd = new Predicate<Integer>() {
        public boolean apply(Integer item) {
                return item % 2 == 1;
        }
};
List<Integer> oddNumbers = filter(odd, asList(1, 2, 3, 4, 5));

并按预期该列表将返回列表[1,3,5]。 Lambdaj在DSL方面走得更远,例如:

List<Beneficiary> beneficiaries = with(transactions)
    .retain(having(on(Transaction.class)
              .getQunatity(), lessThan(100)))
    .extract(on(Transaction.class).getBeneficiary())
    .sort(on(Beneficiary.class).getName());

绩效成本

尽管使应用程序快速运行的最佳方法是拥有尽可能最干净的代码,但是有时您必须进行优化。为此,创建者提供了一些有关内存使用和时间的信息。 Lambdaj有一个性能Wiki页面,其中包含代码示例。 其他程序员也进行了一些测试,例如,他们 lambdaj与JDK8进行了比较 。 关于番石榴的内存使用情况也有一些衡量标准。 至于Guava的性能,大多数功能是标准的JDK类构建器和实用程序,因此开销很小。 归根结底,由您决定这些库中的每一个对您的项目有多大影响,以及这是否有积极意义。 我的想法是,几乎每个项目的类路径上都必须包含Guava。

参考: Java Advent Calendar博客中来自JCG合作伙伴 Mite Mitresky的功能Java集合

翻译自: https://www.javacodegeeks.com/2012/12/functional-java-collections.html