美文网首页程序员
优雅编程 - Guava

优雅编程 - Guava

作者: 林昀熙 | 来源:发表于2019-12-19 10:58 被阅读0次

本篇采用示例的形式展示Guava的常见工具应用.

Guava集合排序

示例代码

List<Integer> list = Arrays.asList(1, 2, 6, 7, 11, 9, 10, 4);
System.out.println("原始集合:" + list);
// 有空元素放置到最后
System.out.println("自然正序:" + Ordering.natural().nullsLast().sortedCopy(list));
// 按照自然排序然后翻转, 有空元素排到最后
System.out.println("自然逆序:" + Ordering.natural().reverse().nullsLast().sortedCopy(list));
// 获取集合最大元素
System.out.println("最小元素:" + Ordering.natural().max(list));
// 获取集合元素中最大的3个元素
System.out.println("最大元素:" + Ordering.natural().greatestOf(list, 3));
// 获取集合最小元素
System.out.println("最小元素:" + Ordering.natural().min(list));
// 获取集合元素中最小的3个元素
System.out.println("最小元素:" + Ordering.natural().leastOf(list, 3));

执行输出

原始集合:[1, 2, 6, 7, 11, 9, 10, 4]
自然正序:[1, 2, 4, 6, 7, 9, 10, 11]
自然逆序:[11, 10, 9, 7, 6, 4, 2, 1]
最小元素:11
最大元素:[11, 10, 9]
最小元素:1
最小元素:[1, 2, 4]

示例代码

public static void main(String[] args) {
    List<User> list = Arrays.asList(new User(1, "Abc"), new User(3, "BAb"), new User(2,"zbc"), new User(4,"fac"));
    System.out.println("原始集合:" + list);
 
    Ordering<User> natureAgeAscOrdering = Ordering.natural().nullsFirst().onResultOf(new Function<User, Integer>() {
        public Integer apply(User input) {
            return input.getAge();
        }
    });
    System.out.println("年龄升序:" + natureAgeAscOrdering.sortedCopy(list));
 
    Ordering<User> natureNameAscOrdering = Ordering.natural().nullsFirst().onResultOf(new Function<User, String>() {
        public String apply(User input) {
            return input.getName();
        }
    });
    System.out.println("姓名升序:" + natureNameAscOrdering.sortedCopy(list));
}
 
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class User{
    private int age;
    private String name;
 
    @Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

执行输出

原始集合:[User{age=1, name='Abc'}, User{age=3, name='BAb'}, User{age=2, name='zbc'}, User{age=4, name='fac'}]
年龄升序:[User{age=1, name='Abc'}, User{age=2, name='zbc'}, User{age=3, name='BAb'}, User{age=4, name='fac'}]
姓名升序:[User{age=1, name='Abc'}, User{age=3, name='BAb'}, User{age=4, name='fac'}, User{age=2, name='zbc'}]

Guava集合过滤&转换

示例代码

List<String> list = Lists.newArrayList("a", "A", "1", "B", "as");
Collection<String> filter = Collections2.filter(list, new Predicate<String>() {
    public boolean apply(String s) {
        return CharMatcher.JAVA_UPPER_CASE.matchesAllOf(s);
    }
});
System.out.println("集合过滤:" + filter);
 
Collection<String> transform = Collections2.transform(list, new Function<String, String>() {
    public String apply(String s) {
        return s.toUpperCase();
    }
});
System.out.println("集合转换:" + transform);

执行输出

集合过滤:[A, B]
集合转换:[A, A, 1, B, AS]

Guava集合切分

示例代码

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
List<List<Integer>> segmentList = Lists.partition(list, 4);
for(List<Integer> segment: segmentList){
   System.out.println(segment);
}

执行输出

[1, 2, 3, 4]
[5, 6, 7]

Guava不可变集合

当你不希望修改一个集合类,或者想做一个常量集合类的时候,使用immutable集合类就是一个最佳的编程实践。

示例代码

ImmutableList<Integer> immutableList = ImmutableList.<Integer>builder()
        .add(1)
        .add(1, 2)
        .addAll(Arrays.asList(2, 3, 5, 5, 6))
        .build();
System.out.println("immutableList:\t" + immutableList);
 
ImmutableSet<Integer> immutableSet = ImmutableSet.<Integer>builder()
        .add(1)
        .add(1, 2)
        .addAll(Arrays.asList(2, 3, 5, 5, 6))
        .build();
System.out.println("immutableSet:\t" + immutableSet);
 
Map<Integer, String> map = Maps.newHashMap();
map.put(1, "val1");
map.put(2, "val2");
map.put(2, "val3");
ImmutableMap<Integer, String> immutableMap = ImmutableMap.copyOf(map);
System.out.println("immutableMap:\t" + immutableMap);

执行输出

immutableList:  [1, 1, 2, 2, 3, 5, 5, 6]
immutableSet:   [1, 2, 3, 5, 6]
immutableMap:   {1=val1, 2=val3}

Guava缓存

示例代码

public static void main(String[] args) {
    TestCache testCache = new TestCache();
    String cacheKey = testCache.buildKey("dateKey");
    System.out.println(testCache.getIfPresent(cacheKey));
    System.out.println(testCache.getCache(cacheKey));
    testCache.putCache(cacheKey, Arrays.asList(1L,2L,3L,4L,5L));
    System.out.println(testCache.getIfPresent(cacheKey));
    System.out.println(testCache.getCache(cacheKey));
}
 
static class TestCache {
 
    public static LoadingCache<String, List<Long>> loadingCache = null;
 
    public TestCache(){
        init();
    }
 
    public void init(){
        loadingCache = CacheBuilder.newBuilder()
                .expireAfterWrite(5, TimeUnit.MINUTES) // 5分钟自动过期
                .build(new CacheLoader<String, List<Long>>() {
                    @Override
                    public List<Long> load(String key) throws Exception {
                        return Lists.newArrayList(); // 默认数据不存在的获取方法
                    }
                });
    }
 
    //获取数据,如果不存在返回null
    public List<Long> getIfPresent(String key){
        return loadingCache.getIfPresent(key);
    }
 
    //获取数据,如果数据不存在则通过cacheLoader获取数据,缓存并返回
    public List<Long> getCache(String key){
        try {
            return loadingCache.get(key);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
 
    //直接向缓存put数据
    public void putCache(String key, List<Long> value){
        if(CollectionUtils.isEmpty(value)){
            return;
        }
        loadingCache.put(key, value);
    }
 
    // 构建缓存Key
    public String buildKey(String cacheKey){
        return cacheKey;
    }
}

执行输出

null
[]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

相关文章

  • 优雅编程 - Guava

    本篇采用示例的形式展示Guava的常见工具应用. Guava集合排序 示例代码 执行输出 示例代码 执行输出 Gu...

  • Google Guava EventBus(事件总线)

    EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现。对于...

  • Guava——EventBus

    EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现。对于事件监...

  • EventBus

    EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现。对于事件监...

  • guava EventBus使用

    EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现。对于事件监...

  • Guava学习笔记:Optional优雅的使用null

    Guava学习笔记:Optional优雅的使用null 在我们学习和使用Guava的Optional之前,我们需要...

  • 重试利器之Guava Retrying

    目录 重试的使用场景 如何优雅地设计重试实现 guava-retrying基础用法 guava-retrying实...

  • Guava - 强大的集合工具Lists

    一、简介 Guava也提供了List相关的较实用的工具类,除了让我们能在编码上更优雅之外,还伴有着防御式编程的特性...

  • 为什么强烈推荐 Java 程序员使用 Google Guava

    备用标题:Google guava,牛逼的脚手架。 Guava - 拯救垃圾代码,写出优雅高效,效率提升N倍[ht...

  • 《一步一步学优雅编程》目录

    优雅编程之这样注释代码,你就“正常”了(一) 优雅编程之这样写函数,你就“正常”了(二) 优雅编程之做1个“正常”...

网友评论

    本文标题:优雅编程 - Guava

    本文链接:https://www.haomeiwen.com/subject/upkmnctx.html