文档章节

走近Guava(三): 集合

ihaolin
 ihaolin
发布于 2014/04/03 15:29
字数 968
阅读 3034
收藏 12

集合:

FluentIterable类:

  • 使用FluentIterable.filter过滤, 即利用Predicate实现:
Iterable<Person> adults = FluentIterable.from(ps).filter(
	new Predicate<Person>() {
		@Override
		public boolean apply(Person p) {
			return p.getAge() >= 18; // 年龄>18
		}
	});
  • 使用FluentIterable.transform()转换,即利用Function实现:
FluentIterable.from(ps).transform(new Function<Person, String>() {
	@Override
	public String apply(Person p) {
	     return Joiner.on('#').join(p.getName(), p.getAge());
	}
});

Lists类:

  • 使用Lists.newArrayList创建列表:
ps = Lists.newArrayList(
	new Person("person1", 22),
	new Person("person2", 23),
	new Person("person3", 17)
);
  • 使用Lists.partition()方法分割列表:
//[a, b, c, d, e] --> [[a, b], [c, d, e]] -
List<List<Person>> subList = Lists.partition(ps, 2);

Sets类:

  • Sets.difference()求S1-S2
Set<String> s1 = Sets.newHashSet("1", "2", "3");
Set<String> s2 = Sets.newHashSet("2", "3", "4");
Sets.difference(s1, s2); //[1]
  • Sets.intersection()求S1,S2交集
Set<String> s1 = Sets.newHashSet("1", "2", "3");
Set<String> s2 = Sets.newHashSet("3", "2", "4");
Sets.SetView<String> sv = Sets.intersection(s1, s2); // [2, 3]
  • Sets.union()求合集
Set<String> s1 = Sets.newHashSet("1", "2", "3");
Set<String> s2 = Sets.newHashSet("3", "2", "4");
Sets.SetView<String> sv = Sets.union(s1, s2); // [3, 2, 1 ,4]

Maps类:

  • Maps.uniqueIndex()将列表转换为map
//iterator各个元素作为Map.values, key为Function.apply返回值
Maps.uniqueIndex(ps.iterator(), new Function<Person, String>() {
	@Override
	public String apply(Person p) {
		return p.getName();
	}
});
  • Maps.asMap(),<K, V>和Maps.uniqueIndex()相反
Maps.asMap(ps, new Function<Person, String>() {
	@Override
	public String apply(Person p) {
		return p.getName();
	}
});
  • Maps Transform API:
Maps.transformEntries(map, new Maps.EntryTransformer<String, Boolean, String>() {
    @Override
    public String transformEntry(String key, Boolean value) {
        return value ? "yes" : "no";
    }
}); 将Map<String, Boolean> --> Map<String, String>, 其他的还有Maps.transformValues转换值

Multimaps:

  • 一个key对应多个value

ArrayListMultiMap:

ArrayListMultimap<String, String> multiMap = ArrayListMultimap.create();
multiMap.put("Foo", "1");
multiMap.put("Foo", "2");
multiMap.put("Foo", "3");
System.out.println(multiMap); // {Foo=[1,2,3]}
当出现重复值时,依然会被添加,因为ArrayListMultiMap的value时一个ArrayList:
ArrayListMultimap<String, String> multiMap = ArrayListMultimap.create();
multiMap.put("Bar", "1");
multiMap.put("Bar", "2");
multiMap.put("Bar", "3");
multiMap.put("Bar", "3");
multiMap.put("Bar", "3");
System.out.println(multiMap); //{Bar=[1, 2, 3, 3, 3]},相同的value会重复,value内部是一个List

HashMultiMap:

HashMultimap<String, String> multiMap = HashMultimap.create();
multiMap.put("Bar", "1");
multiMap.put("Bar", "2");
multiMap.put("Bar", "3");
multiMap.put("Bar", "3");
multiMap.put("Bar", "3");
System.out.println(multiMap); //{Bar=[3, 2, 1]}, 相同的value不会重复,value内部是一个Set

其他一些MultiMap:

LinkedHashMultimap //顺序的HashMultimap, 形如LinkedHashMap
TreeMultimap //可排序的MultiMap, 形如TreeMap
//一些不可变的map
ImmutableListMultimap
ImmutableMultimap
ImmutableSetMultimap

BiMap:

  • 其限制value是唯一的,且通过value可以找到key
BiMap<String,String> biMap = HashBiMap.create();
biMap.put("1","Tom");         
biMap.put("2","Tom"); //抛出异常
  • BiMap.forcePut()强制放入value相等的entry:
BiMap<String, String> biMap = HashBiMap.create();
biMap.put("1", "Tom");
biMap.forcePut("2", "Tom");
System.out.println(biMap); //{2=Tom}
  • BiMap.inverse()反转key-value
BiMap<String, String> biMap = HashBiMap.create();
biMap.put("1", "Tom");
biMap.put("2", "Harry");
BiMap<String, String> inverseMap = biMap.inverse();
System.out.println(biMap); //{2=Harry, 1=Tom}
System.out.println(inverseMap); //{Harry=2, Tom=1

Table:

  • 它具有2个key[行, 列],对应一个值

HashBasedTable:

  • 通用操作
HashBasedTable<Integer, Integer, String> table = HashBasedTable.create();
table.put(1, 1, "Rook");
table.put(1, 2, "Knight");
table.put(1, 3, "Bishop");
System.out.println(table.contains(1, 1)); //true
System.out.println(table.containsColumn(2)); //true
System.out.println(table.containsRow(1)); //true
System.out.println(table.containsValue("Rook")); //true
System.out.println(table.remove(1, 3)); //Bishop
System.out.println(table.get(3, 4)); //null
  • Table views,表行列视图
Map<Integer,String> columnMap = table.column(1);
Map<Integer,String> rowMap = table.row(2);
  • 其他table
ArrayTable //二维数组实现
ImmutableTable //不可变table,创建后不能改变
TreeBasedTable //对行列排序的table

Range:

  • 代表一种范围的类。
Range<Integer> numberRange = Range.closed(1, 10); //包括首尾
System.out.println(numberRange.contains(10)); //true
System.out.println(numberRange.contains(1)); //true
		
Range<Integer> numberRange1 = Range.open(1,10); //除去首尾
System.out.println(numberRange1.contains(10)); //false
System.out.println(numberRange1.contains(1)); //false
  • RangeFunction组合成Predicate的过滤条件
Range<Integer> ageRange = Range.closed(35, 50);
//Person到age转换的function
Function<Person, Integer> ageFunction = new Function<Person, Integer>() {
	@Override
	public Integer apply(Person person) {
		return person.getAge();
	}
};
//这样得到年龄再[35, 50]之间的人
Predicate<Person> predicate = Predicates.compose(ageRange,ageFunction);
  • 创建不可变的集合
MultiMap<Integer,String> map = new ImmutableListMultimap.Builder<Integer,String>()
                                   .put(1,"Foo").putAll(2,"Foo","Bar","Baz")
                                   .putAll(4,"Huey","Duey","Luey")
                                   .put(3,"Single").build();

Ordering:

  • Ordering提供了一些简单强大的排序功能。
/**
 * 城市人口比较器
 */
public class CityByPopluation implements Comparator<City> {
	@Override
	public int compare(City city1, City city2) {
		return Ints.compare(city1.getPopulation(), city2.getPopulation());
	}
}
  • 反序
Ordering.from(cityByPopluation).reverse();
  • 处理Null
Ordering.from(comparator).nullsFirst();//null值最小放在前面
  • 二次排序
/**
 * 雨量比较器
 */
public class CityByRainfall implements Comparator<City> {
	@Override
	public int compare(City city1, City city2) {
		return Doubles.compare(city1.getAverageRainfall(),
				city2.getAverageRainfall());
	}
}
Ordering<City> secondaryOrdering = Ordering.from(cityByPopulation).compound(cityByRainfall);//组合比较器
Collections.sort(cities,secondaryOrdering); //排序
  • 获取最大最小
Ordering<City> ordering = Ordering.from(cityByPopluation);
List<City> topFive = ordering.greatestOf(cityList,5); //前5个
List<City> bottomThree = ordering.leastOf(cityList,3); //最后3个
看来Guava在集合方面还是很给力的。

不吝指正。

© 著作权归作者所有

ihaolin
粉丝 263
博文 164
码字总数 106524
作品 4
朝阳
高级程序员
私信 提问
走近Guava(二): 函数式编程

函数式编程: 使用Function接口(jdk8中已经存在): /** 其功能就是将输入类型转换为输出类型 /public interface Function<F, T> {T apply(@Nullable F input);} 比如一个简单的日期转换: /*...

ihaolin
2014/04/01
1K
0
Google Guava 笔记

一、引言 Guava 是 google 几个java核心类库的集合,包括集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common ...

qllinhongyu
2014/09/18
0
0
Google Guava 类库简介(1)

Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这......

十二缸帕萨特
2015/10/07
75
0
Google的Guava类库简介(转)

说明:信息虽然有点旧,至少可以先了解个大概。 Guava是一个Google的基于Java的类库集合的扩展项目,包括collections, caching, primitives support, concurrency libraries, common annotat...

easonjim
2017/11/01
0
0
Guava学习笔记:Google Guava 类库简介

Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这......

长平狐
2013/06/17
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
5
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
8
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
昨天
10
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
昨天
6
0
PHP+Ajax微信手机端九宫格抽奖实例

PHP+Ajax结合lottery.js制作的一款微信手机端九宫格抽奖实例,抽奖完成后有收货地址添加表单出现。支持可以设置中奖概率等。 奖品列表 <div class="lottery_list clearfix" id="lottery"> ......

ymkjs1990
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部