0
点赞
收藏
分享

微信扫一扫

Guava中函数的学习和使用

一、前言

Google Guava 是 Java 通用库的开源集合,主要由 Google 工程师开发。 Google 有许多 Java 项目。 Guava 是解决那些项目中遇到的许多常见问题的解决方案,其中包括集合,数学,函数习语,输入&输出和字符串等领域。

二、字符串处理之Joiner和Splitter

1.引入依赖

<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>16.0.1</version>
		</dependency>

2.示例代码

package com.example.springbootdemo.test;

import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;

public class SplitDemo {
    //连接器
    private static final Joiner joiner = Joiner.on(",").skipNulls();
    //分割器
    private static final Splitter splitter = Splitter.on(",").trimResults().omitEmptyStrings();

    public static void main(String[] args) {
        String join = joiner.join(Lists.newArrayList("a", null, "b", " ", "c"));
        System.out.println(join);

        for (String temp : splitter.split(" a,  ,b,,")) {
            System.out.println("|" + temp + "|");
        }
    }
}

3.测试结果

Guava中函数的学习和使用_List

Joiner是连接器,Splitter是分割器,skipNulls()过滤掉null元素。

三、对基本类型进行支持

guava对JDK提供的原生类型操作进行了扩展,使得功能更加强大!

1.示例代码

package com.example.springbootdemo.test;

import com.google.common.primitives.Ints;

import java.util.Arrays;
import java.util.List;

public class GuavaDemo {
    public static void main(String[] args) {
        List<Integer> list = Ints.asList(1, 3, 5, 7, 9);
        System.out.println(Ints.join(",", 1, 2, 3, 4));

        //多个数组快速合并
        int[] newIntArray = Ints.concat(new int[]{1, 2}, new int[]{3, 4, 5});
        System.out.println(newIntArray.length);

        //获取最大值和最小值
        System.out.println("最大值:" + Ints.max(newIntArray));
        System.out.println("最小值:" + Ints.min(newIntArray));

        //是否包含某个元素
        System.out.println(Ints.contains(newIntArray, 8));

        //集合到数组的转换
        int[] array = Ints.toArray(list);
        System.out.println(Arrays.toString(array));
    }
}

2.测试结果

Guava中函数的学习和使用_System_02

guava提供了Bytes/Shorts/Ints/Iongs/Floats/Doubles/Chars/Booleans这些基本数据类型的扩展支持,只有你想不到的,没有它没有的!

四、函数式编程Functions、Predicate

我们可以使用函数式编程的方式提供自定义的Function操作。

Functions

1.示例代码

package com.example.springbootdemo.test;

import com.google.common.base.Function;
import com.google.common.base.Functions;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;

import java.util.Collection;
import java.util.List;

public class FunctionsDemo {
    public static void main(String[] args) {
        List<String> list = Lists.newArrayList("a", "b", "c", "d");

        Function<String, String> f1 = s -> s.length() <= 5 ? s : s.substring(0, 5);
        Function<String, String> f2 = String::toUpperCase;

        Function<String, String> f3 = Functions.compose(f1, f2);
        Collection<String> collection = Collections2.transform(list, f3);
        for (String tmp : collection) {
            System.out.println(tmp);
        }
    }
}

2.测试结果

Guava中函数的学习和使用_List_03

Predicate

Predicate最常用的功能就是运用在集合的过滤当中!

1.示例代码

package com.example.springbootdemo.test;

import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;

import java.util.Collection;
import java.util.List;

public class PredicateDemo {
    public static void main(String[] args) {
        List<String> list = Lists.newArrayList("aa", "bb", "cc", "dd");
        Collection<String> collection = Collections2.filter(list, s -> new StringBuilder(s).length() > 1);
        for (String s : collection) {
            System.out.println(s);
        }

    }
}

2.测试结果

Guava中函数的学习和使用_System_04

五、异步回调

1.示例代码

package com.example.springbootdemo.test;

import com.google.common.util.concurrent.*;

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class FutureDemo {
    public static void main(String[] args) {
        //JDK所提供的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        //封装带有接听回调功能的线程池
        ListeningExecutorService listeningExecutorService = MoreExecutors.listeningDecorator(executorService);

        ListenableFuture<Integer> listenableFuture = listeningExecutorService.submit(() -> {
            if (new Random().nextInt(3) == 2) {
                throw new NullPointerException();
            }
            return 1;
        });
        FutureCallback futureCallback = new FutureCallback() {
            @Override
            public void onSuccess(Object o) {
                System.out.println("---------" + o);
            }

            @Override
            public void onFailure(Throwable throwable) {
                System.out.println(throwable.getMessage());
            }
        };

        Futures.addCallback(listenableFuture, futureCallback);
    }
}

2.执行结果

Guava中函数的学习和使用_System_05

我们可以通过guava对JDK提供的线程池进行装饰,让其具有异步回调监听功能,然后在设置监听器即可!

举报

相关推荐

0 条评论