guava Joiner和MapJoiner线程安全

  • {@code Joiner} 和 {@code MapJoiner} 的实例总是 immutable(详见java并发编程实战相关部分)
  • [ 1.状态创建后不能被修改. 2.所有的域都是final类型,并且它被正确创建(创建期间没有发生this引用的逸出) ]
  • 创建通过静态函数on,内部调用构造函数,对于设置null类型的时候,函数内部会生成一个匿名类,从而重载设置null类型的相关函数.
  • 所以他们都是线程安全的. 他们的构造函数都是私有的,必须调用他们的静态方法生成他们的对象(不用反射构造对象情况下)
    public class Chapter2Code {
    
    private final List<String> list = Lists.newArrayList("name", "doctor", "sex", "man", null);
    
    @Rule
    public ExpectedException expectedException = ExpectedException.none();
    
    @Test
    public void test_Joiner() {
    
        Joiner joiner = Joiner.on(",").skipNulls();
    
        assertThat(joiner.join(list), equalTo("name,doctor,sex,man"));
    
        joiner = Joiner.on(",").useForNull("null");
        assertThat(joiner.join(list), equalTo("name,doctor,sex,man,null"));
    
        joiner = Joiner.on("|");
        expectedException.expect(NullPointerException.class);// 如果不处理空指针,会抛出异常.
        joiner.join(list);
    
    }
    
    @Test
    public void test_Joiner_wrong_use() {
    
        Joiner joiner = Joiner.on(",");
        joiner.skipNulls();// 这个方法会生成一个新的对象,对原对象的设置无影响
        expectedException.expect(NullPointerException.class);
        joiner.join(list);
    }
    
    @Test
    public void test_Joiner_appendTo_StringBuilder() {
        Joiner joiner = Joiner.on("|").skipNulls();
        StringBuilder builder = new StringBuilder(256);
    
        joiner.appendTo(builder, list);
    
        assertThat(builder.toString(), equalTo("name|doctor|sex|man"));
        System.out.println(builder.toString());
    }
    
    @Test
    public void test_Joiner_appendTo_File() throws IOException {
        File file = new File("a.txt");
    
        if (!file.exists()) {
            file.createNewFile();
        }
    
        try (FileWriter fileWriter = new FileWriter(file);) {
            Joiner.on("#").skipNulls().appendTo(fileWriter, list);
    
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    
        List<String> lines = Files.readAllLines(Paths.get("a.txt"));
    
        System.out.println(lines);
        assertThat(Joiner.on("").join(lines), equalTo(Joiner.on("#").skipNulls().join(list)));
    
    }
    
    @Test
    public void test_MapJoiner() {
        Map<String, String> map = Maps.newLinkedHashMap();
        map.put("name", "doctor");
        map.put("sex", "man");
    
        String join = Joiner.on(",").withKeyValueSeparator("=").join(map);
        assertThat(join, equalTo("name=doctor,sex=man"));
    }
    }
    
时间: 2024-12-19 03:58:28

guava Joiner和MapJoiner线程安全的相关文章

[转]基本Guava工具

转自:http://www.cnblogs.com/renchunxiao/p/3661918.html?utm_source=tuicool 使用Joiner类 将任意字符串通过分隔符进行连接到一起是大多程序员经常做的事情.他们经常使用array,list,iterable并且循环变量将每一个临时变量添加到StringBuilder当中去,并且中间添加分隔符.这些笨重的处理方式如下: public String buildString(List<String> stringList, Str

使用Guava retryer优雅的实现接口重试机制

转载自: 使用Guava retrying优雅的实现接口重调机制 Guava retrying:基于 guava 的重试组件 实际项目中,为了考虑网络抖动,加锁并发冲突等场景,我们经常需要对异常操作进行重试.优雅的重试 其实就是将业务处理逻辑和重试逻辑分离. 下面是原文地址: API 接口调用异常和网络异常在我们日常开发中经常会遇到,这种情况下我们需要先重试几次才能将其标识为错误并在确认错误之后发送异常提醒. Guava retrying 可以灵活的实现这一功能.Guava retrying在支

java retry(重试) spring retry, guava retrying 详解

系列说明 java retry 的一步步实现机制. java-retry 源码地址 情景导入 简单的需求 产品经理:实现一个按条件,查询用户信息的服务. 小明:好的.没问题. 代码 UserService.java public interface UserService { /** * 根据条件查询用户信息 * @param condition 条件 * @return User 信息 */ User queryUser(QueryUserCondition condition); } Use

Java基础学习(一)数据结构

基础问题  1. 几类数据结构的定义和区别是什么? 2. 容器的数据结构底层是怎么实现的?怎么进行扩容? 3. 容器的线程安全怎么实现?   一.List容器 数据有序,允许重复数据,线程不安全. 1. linkedList  底层用双向链表实现,操作速度快,可以在头.尾.[n]操作数据. 2. ArrayList 底层用数组实现,查询速度快,默认数组大小是10.可以通过new ArrayList<Object>(n)设置n的值来指定数组的size,这样可以节省空间并避免数组扩容引起的效率下降

coding++:Semaphore—RateLimiter-漏桶算法-令牌桶算法

java中对于生产者消费者模型,或者小米手机营销 1分钟卖多少台手机等都存在限流的思想在里面. 关于限流 目前存在两大类,从线程个数(jdk1.5 Semaphore)和RateLimiter速率(guava) Semaphore:从线程个数限流 RateLimiter:从速率限流  目前常见的算法是漏桶算法和令牌算法 令牌桶算法.相比漏桶算法而言区别在于,令牌桶是会去匀速的生成令牌,拿到令牌才能够进行处理,类似于匀速往桶里放令牌 漏桶算法是:生产者消费者模型,生产者往木桶里生产数据,消费者按照

你应该这样去开发接口:Java多线程并行计算

所谓的高并发除了在架构上的高屋建瓴,还得需要开发人员在具体业务开发中注重自己的每一行代码.每一个细节,面子有的同时,更重要的还是要有里子. 面对性能,我们一定要有自己的工匠精神,不可以对任何一行代码妥协! 今天和大家分享在业务开发中如何降低接口响应时间的一个小技巧,也是大家日常开发中比较普遍存在的一个问题,即如何提高程序的并行计算能力? 本文主要包含以下内容: 顺序执行很慢 线程池+Future并行计算 使用Java8的CompletableFuture 使用Guava的ListenableFu

各科基础详实

一. Java基础部分 1. JAVA的基本数据类型有哪些 ?  String 是不是基本数据类型 ? 2. 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 3. Java有没有goto? 7 4. 说说&和&&的区别. 7 5. 在JAVA中如何跳出当前的多重嵌套循环? 7 6. switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 8 7. short s1 = 1; s1 = s1 + 1;有什么

guava的String中的Joiner

1.Joiner用处 Joiner用来将一系列的字符串进行合并,合并之后的每个字符串之间可以用特定的分隔符,并且可以用来处理含有null的字符串的情况. 2.Jointer的常用方法 1.public static Joiner on(String separator)或者public static Joiner on(char separator); 该方法设置合并字符串之间的分隔符. 2.public Joiner skipNulls(); 返回一个Joiner类型,并且能够跳过处理null

Guava学习笔记之Joiner ,Strings,Splitter 工具实例

Guava 一.Strings 1.Strings.padEnd方法 //padEnd普全右 String a="12345"; String b=Strings.padEnd(a, 10, 'x'); System.out.println(b); 结果为:12345xxxxx 2.Strings.padStart方法 //padStart 普全左 String a="12345"; String b=Strings.padStart(a, 10, 'x'); Sy