Guava常用操作

一、List与String之间的转换

1. String 转 List

java 复制代码
String str = "a, b, c";  
List<String> result = Splitter.on(",").trimResults().splitToList(str); 

2. List 转 String

java 复制代码
List<String> list = new ArrayList<String>();  
list.add("a");  
list.add("b");  
list.add("c");  
String str = Joiner.on(",").join(list);

参考:https://blog.csdn.net/jicahoo/article/details/44105109


二、什么时候应该用Optional?

Google的官方文档中说,它是用来避免使用null的,而且Google的code base中大约95%的collection中不该含有null值。

eg : 当Map.get(key)返回null时,可能是因为Map中的值为null,也有可能是Map中没有对应的值。

Optional的最常用价值在于,例如,假设一个方法返回某一个数据类型,调用这个方法的代码来根据这个方法的返回值来做下一步的动作,若该方法可以返回一个null值表示成功,或者表示失败,在这里看来都是意义含糊的,所以使用Optional作为返回值 ,则后续代码可以通过isPresent()来判断是否返回了期望的值(原本期望返回null或者返回不为null,其意义不清晰),并且可以使用get()来获得实际的返回值。

个人理解,Optional存在的主要意义是用来规避 不明确的语义,比如Null,因为我们不知道Null到底是正确的返回结果还是本来就不存在;在我们的业务中,就比如,作为底层接口,如果查询不到结果,就返回一个无上级组织

java 复制代码
public OrgView getUpperOrgById(long orgId) {
      List<OrgView> orgViews = orgQueryIface.getUpperOrgListByOrgId(orgId);
        if(CollectionsUtils.isNotEmpty(orgViews)){
        	return orgViews.get(0);    
        }
    	OrgView orgView = new OrgView();
    	orgView.setName("无组织");
    	orgView.setId(-1);
    	return orgView;
}

上面这段代码在判断如果得到的orgViews为空串的时候,就返回一个无组织,这对于上游服务来说就是不明确的语义,因为上游有可能希望如果没有上级组织,需要自己的业务里面做处理,所以这时候就应该是用Optional来做处理

java 复制代码
public Optional<OrgView> getUpperOrgById(long orgId) {
		List<OrgView> orgViews = orgQueryIface.getUpperOrgListByOrgId(orgId);
		return Optional.of(orgViews.get(0));
	}

这样,上游根据Optional<OrgView>.isPresent()就可以判断是否拿到明确的含义,如果存在就认为是能够找到上级组织,如果不存在就做自己的业务处理。


三、Guava EventBus & JDK Observer模式

JDK Observer模式

java 复制代码
public class ObserverModeEx {

	public static class MailObservable extends Observable{
		@Override
		protected synchronized void setChanged() {
			super.setChanged();
		}

		@Override
		public void notifyObservers(Object event) {
			super.notifyObservers(event);
		}
	}

	public static class MailObserver implements Observer{

		@Override
		public void update(Observable o, Object arg) {
			System.out.println("观察到来自" + arg + "的邮件");
		}
	}

	public static void main(String[] args) {
		MailObserver mailerLi = new MailObserver();
		MailObserver mailerWang = new MailObserver();

		MailObservable mailObservable = new MailObservable();
		mailObservable.addObserver(mailerLi);
		mailObservable.addObserver(mailerWang);

		mailObservable.setChanged();
		mailObservable.notifyObservers("北京");
		mailObservable.setChanged();
		mailObservable.notifyObservers("天津");

	}
}

Guava EventBus

咬文嚼字

EventBus = Event(事件) + Bus(总线)

Guva中EventBus的机制就是观察者模式,因此符合观察者模式的一般结构:

监听者:监听来自被监听者的变更事件,完成动作变更

被监听者:发送变更事件给监听者,使监听者监听到变更事件后,完成动作变更

EventBus的用法简单总结为一句话就是:

订阅者向EventBus进行事件注册(register),表示对这个事件关心;

EventBus会向所有订阅发布者事件的订阅者进行事件的发送(post)

图解说明

向EventBus注册监听者------> Listener订阅事件 ------> EventBus发布事件

java 复制代码
public class EventBusSyncEx {

	@Data
	static class Event2 {
		private String header;
		private String body;

		public Event2(String header, String body) {
			this.header = header;
			this.body = body;
		}
	}

    static class SimpleListener1 {
        /**
         *订阅方式,通过@Subscribe进行事件订阅,方法名随意
         **/
        @Subscribe
        public void task1(String s) {
            System.out.println("listener1 do task , String param:" + s);
        }


        @Subscribe
        public void task3(Object s) {
            System.out.println("listener1 do task , Object param:" + s);
        }

        @Subscribe
        public void task1(Event2 s) {
			System.out.println("event header is " + s.getHeader() + ": " + "event body is " + s.getBody());
        }
    }

    static class SimpleListener2 {
        /**
         *订阅方式,通过@Subscribe进行事件订阅,方法名随意
         **/
        @Subscribe
        public void task(String s) {
            System.out.println("listener2 do task , param:" + s);
        }
    }



    public static class SimpleEventBusExample {

        public static void main(String[] args) {
            EventBus eventBus = new EventBus();
            eventBus.register(new SimpleListener1());
            eventBus.register(new SimpleListener2());

            System.out.println("Post Simple EventBus Example");
            eventBus.post("事件一");
            eventBus.post(new Event2("header", "body"));

        }
    }
}

结论

  • EventBus,guava基于观察者模式的优雅实现。对于事件监听和发布订阅模式,使用guava eventbus可以省去开发人员很多事情,不同于JDK自带的Observer模式,不用在去定义那些复杂的类或接口来实现事件发布与订阅,Guava的EventBus 只需要关注事件类型及监听类的对应开发工作既可以。
  • 方便的支持异步
相关推荐
Passion不晚4 分钟前
Java 全栈开发中的最佳实践:从前端到后端的完整流程
java·前端·全栈
THE WHY12 分钟前
【systemctl start jenkins】启动报错问题解决
java·运维·ci/cd·jenkins
敲代码的小王!1 小时前
mybatisplus介绍以及使用(下)
java·数据库·mybatis
卡卡卡卡罗特2 小时前
naocs注册中心,配置管理,openfeign在idea中实现模块间的调用,getway的使用
java·开发语言
星迹日2 小时前
Java: 数据类型与变量和运算符
java·开发语言·经验分享·笔记
南浔Pyer3 小时前
AI驱动的Java开发框架:Spring AI Alibaba实战部署教程
java·人工智能·spring boot·spring·maven·idea
神的孩子都在歌唱5 小时前
行为设计模式 -模板方法模式- JAVA
java·设计模式·模板方法模式
Satan7127 小时前
【Java】虚拟机(JVM)内存模型全解析
java·开发语言·jvm
远望樱花兔8 小时前
【d54_2】【Java】【力扣】142.环形链表
java·leetcode·链表
IT学长编程8 小时前
计算机毕业设计 助农产品采购平台的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·助农产品采购平台