java集合的功能_功能性Java集合

java集合的功能

如今,在功能上大肆宣传,因此至少在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

java集合的功能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值