互联网科技程序员今日看点

Java之项目用到类Objects,TreeMap排序简单分享

2017-01-20  本文已影响189人  阿_毅

开心一笑

【记者去采访一山区百岁老农: “老人家,你是吃什么东西才能保持长寿的啊?”
百岁老农: “我们这只能种玉米,平时也是以玉米为主食。”
记者: “那你现在最大的愿望是什么呢”。
百岁老农: “我最想死。”
记者: “啊!为什么?”
百岁老农:“吃了一百年的玉米,你不想死啊?”】

唯美图片

提出问题

项目常用类Objects,TreeMap分享???

解决问题

1.Objects介绍

Java.Util.Objects是Java 1.7引入的类,提供了针对对象的一些常用方法,总共提供了12个方法。可以自己查看JDK帮助文档,项目中,我用到的一个常用方法就是isNull/nonNull

2.isNull/nonNull具体实例

在工作中我经常会用Objects.isNull()来判断对象是否为空。下面是一些

/**
 * @Author 阿毅
 * Created by Ay on 2016/01/05.
 */
public class Ay{

    @Test
    public void test(){
        Boy boy = null;
        Girl girl = new Girl();
        List<Boy> boyList = new ArrayList<>();
        List<Girl> girlList = null;
        String testStr = null;
        System.out.println("boy is :" + Objects.isNull(boy));//boy is :true
        System.out.println("gire is : " + Objects.isNull(girl));//gire is : false
        System.out.println("boyList is :" + Objects.isNull(boyList));//boyList is :false
        System.out.println("girlList is :" + Objects.isNull(girlList));//girlList is :true
        System.out.println("testStr is + " + Objects.isNull(testStr));//testStr is + true
        System.out.println(">>>--------------------------------------");
        System.out.println("boy is :" + Objects.nonNull(boy));//boy is :false
        System.out.println("gire is : " + Objects.nonNull(girl));//gire is : true
        System.out.println("boyList is :" + Objects.nonNull(boyList));//boyList is :true
        System.out.println("girlList is :" + Objects.nonNull(girlList));//girlList is :false
        System.out.println("testStr is + " + Objects.nonNull(testStr));//testStr is + false
    }

    class Boy{}
    class Girl{}

}

3.俩种对象判空的个人想法

对象判空if(object == null)也是可以的。

但是:

个人感觉if(Objects.isNull(object)) 比 if(object == null) 更加标准和正规。

我们看看Objects对象判空的源码

public static boolean isNull(Object obj) {
    return obj == null;
}

4.SortedMap和TreeMap简单介绍

SortedMap保证按照键的升序排列的映射,可以按照键的自然顺序(参见 Comparable 接口)进行排序,或者通过创建有序映射时提供的比较器进行排序。

SortedMap是一个接口,TreeMap是其具体实现。

理论一大堆,自己上百度搜。

5.SortedMap和TreeMap默认升序排序实例

TreeMap默认按照升序排序

例1:

@Test
public void test() throws Exception{
    //TreeMap默认按照升序排序
    SortedMap<Double, String> map = new TreeMap<>();
    map.put(2.33, "ccccc");
    map.put(2.0, "aaaaa");
    map.put(3.0, "bbbbb");
    map.put(4.0, "ddddd");
    Set<Double> keySet = map.keySet();
    Iterator<Double> iter2 = keySet.iterator();
    while (iter2.hasNext()) {
        Double key = iter2.next();
        System.out.println(key + ":" + map.get(key));
    }
}

打印结果:

2.0:aaaaa
2.33:ccccc
3.0:bbbbb
4.0:ddddd

例2:

@Test
public void test(){
    //TreeMap默认按照升序排序
    SortedMap<String, String> map = new TreeMap<>();
    map.put("b", "ccccc");
    map.put("d", "aaaaa");
    map.put("c", "bbbbb");
    map.put("a", "ddddd");
    Set<String> keySet = map.keySet();
    Iterator<String> iter = keySet.iterator();
    while (iter.hasNext()) {
        String key = iter.next();
        System.out.println(key + ":" + map.get(key));
    }
}

打印结果:

a:ddddd
b:ccccc
c:bbbbb
d:aaaaa

5.SortedMap和TreeMap降序排序实例

TreeMap默认是升序的,如果我们需要改变排序方式,则需要使用比较器:Comparator。Comparator可以对集合对象或者数组进行排序的比较器接口,实现该接口的public compare(T o1,To2)方法即可实现排序,如下:

@Test
public void test(){
    //TreeMap默认按照升序排序
    Map<String, String> map = new TreeMap<>(new Comparator<String>(){
        public int compare(String obj1, String obj2) {
            // 降序排序
            return obj2.compareTo(obj1);
            // 升序排序
            //return obj1.compareTo(obj2);
        }
     });
    map.put("b", "ccccc");
    map.put("d", "aaaaa");
    map.put("c", "bbbbb");
    map.put("a", "ddddd");
    Set<String> keySet = map.keySet();
    Iterator<String> iter = keySet.iterator();
    while (iter.hasNext()) {
        String key = iter.next();
        System.out.println(key + ":" + map.get(key));
    }
}

6.Java中Map集合对Value字段进行排序

这个需求是我在项目中碰到的问题,业务场景如下:

想要通过获取Map集合中Value值最大,所对应的Key的值。

网上搜索下,本来想搜索相关的开源工具类,结果没找到。不过已经有高手写了些工具类,具体如下:

这里我只贴出Java8的版本,代码很简洁:

 //传入一个map集合
 public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) {
    //新建一个LinkedHashMap对象
    Map<K, V> result = new LinkedHashMap<>();
    //获取Entry<K,V>流
    Stream<Entry<K, V>> st = map.entrySet().stream();
    //利用函数式进行排序
    st.sorted(Comparator.comparing(e -> e.getValue())).forEach(e -> result.put(e.getKey(), e.getValue()));

    return result;
}

读书感悟

来自刘瑜《观念的水位》

经典故事

钉子:有一个男孩有着很坏的脾气,于是他的父亲就给了他一袋钉子;并且告诉他,每当他发脾气的时候就钉一根钉子在后院的围篱上。第一天,这个男孩钉下了37 根钉子。慢慢地每天钉下的数量减少了。他发现控制自己的脾气要比钉下那些钉子来得容易些。终于有一天这个男孩再也不会失去耐性乱发脾气,他告诉他的父亲这件事,父亲告诉他,现在开始每当他能控制自己的脾气的时候,就拔出一根钉子。一天天地过去了,最后男孩告诉他的父亲,他终于把所有钉子都拔出来了。父亲握着他的手来到后院说:你做得很好,我的好孩子。但是看看那些围篱上的洞,这些围篱将永远不能回复成从前。你生气的时候说的话将像这些钉子一样留下疤痕。如果你拿刀子捅别人一刀,不管你说了多少次对不起,那个伤口将永远存在。话语的伤痛就像真实的伤痛一样令人无法承受。】

大神文章

【1】7.10.2 Java 7 新增的Objects 类
【2】java.util.Objects工具类示例
【3】JDK 7:java.util.Objects中应该包含哪些常用方法呢?
【4】[疯狂Java]基础类库:Object、深拷贝、Objects工具类
【5】对Java的Map的Value字段进行排序
【6】Sort a Map<Key, Value> by values (Java)

唯美图片

其他

如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎点赞、顶、欢迎留下宝贵的意见、多谢支持!

上一篇下一篇

猜你喜欢

热点阅读