Java8Stream自定义复杂排序

@Test
    public void  testSet(){
        List<Map<String,Object>> list=new ArrayList<Map<String, Object>>();
        Map<String,Object> map=new HashMap<String, Object>();
        map.put("name","name1");
        map.put("age",12);
        list.add(map);

        Map<String,Object> map2=new HashMap<String, Object>();
        map2.put("name","name2");
        map2.put("age",13);
        list.add(map2);

        System.out.println("排序前:"+list.toString());
        list=list.stream()
                //第一个排序条件
                //假设自定义对象为Obj,则可直接写为Obj::getName
                .sorted(Comparator.comparing(Application::getName)
                        //第二个排序条件(可一直延伸)
                        .thenComparing(Application::getAge).reversed()).collect(Collectors.toList());
        System.out.println("排序后:"+list.toString());
    }

    private static String getName(Map<String,Object> map){
        return (String) map.get("name");
    }

    private static int getAge(Map<String,Object> map){
        return (int) map.get("age");
    }

Java8特性Stream中map与forEach的区别

//Map接口的定义
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
//forEach接口的定义
void forEach(Consumer<? super T> action);

通过接口定义可以看出,两者最明显的区别就是map有返回值,forEach没有返回值

所以在具体调用时,map调用时可以return一个对象到外部,如下: read more

采用java8Stream对集合进行处理

//测试数据
        List<Map<Integer,Object>> list=new ArrayList<>();
        list.add((Map<Integer, Object>) new HashMap<>().put(222,"222"));
        list.add((Map<Integer, Object>) new HashMap<>().put(111,"111"));
        //筛选数据
        List<Map<Integer,Object>> a=list.stream().filter(info -> info.get("key").equals("123")).collect(Collectors.toList());
        //排序 针对String排序系统给出了更好的解决方案,如list中为自定义对象可通过以下方法进行排序
        list=list.stream().sorted(Comparator.comparing(Map::keySet)).collect(Collectors.toList());//升序
        list=list.stream().sorted(Comparator.comparing(Map::keySet).reversed()).collect(Collectors.toList());//降序
        //遍历集合进行操作,{}内可写入大量代码块
        list.forEach((Map<Integer, Object> info)->{info.put(333,"333");});
        //筛选出来的数据条数
        System.out.println(list.stream().filter(info->info.equals("123")).count());
* 当前只列举出了本人近期使用频率较高的几种语法,如无特殊的业务逻辑,以上几种的组合使用已经可以在一定程度上减少大量的开发代码
* 后续如遇到其他使用频率较高的写法会持续更新进来

采用java8新特性实现自定义lambda编程

* lambda语法 Lambda允许把函数作为一个方法的参数传递进方法中
* 适用场景:在一个大块的共用逻辑中间,穿插一块非共用的逻辑,在java8之前也可以采用传入某个字段在适当位置通过switch语句进行区分
* lambda可以应用到很多的业务场景中,本文只简要说明本人所遇到的业务场景
* 代码换环境执行一定要注意jdk的版本是否大于等于1.8
import org.junit.Test;

/**
 * @ClassName LambdaTest
 * @Author justin.Sun
 * @Date 2019/2/18 10:18
 **/
public class LambdaTest {

    //声明接口
    interface  Executor{
        String execute(String arg);
    }

    //调用时需要传入代码块的方法
    private Object runExecute(Executor executor,String arg){
        // TODO: 2019/2/18 公用代码块...

        //传入arg参数并执行代码块
        return executor.execute(arg);
    }

    @Test
    public void test(){
        //传入参数
        String param="test";
        //{}中的代码块相当于实现了上面定义的接口中的方法
        System.out.println(runExecute((String arg)->{return getResult(arg);},param));
    }

    //传入的代码块
    public String getResult(String arg){
        String result=arg;
        // TODO: 2019/2/18 逻辑块...
        return result;
    }
}
* 对于自定义lambda本人也尚处于初步阶段,上文仅用于记录,如有不正之处还请指正

启动项目出现异常Unsupported major.minor version 52.0

原因:
当你使用了高版本的 JRE(如1.8) 编译出.class 文件,但是运行的时候反而使用低版本的 JRE

major version:

Java SE 8 = 52(当前), 
Java SE 7 = 51, 
Java SE 5.0 = 49, 
JDK 1.4 = 48, 
JDK 1.3 = 47, 
JDK 1.2 = 46

解决方案:

1、使用高版本的 JRE 运行,如当报错为Unsupported major.minor version 52.0时,使用 1.8 运行 
基本适用所有情况

2、适用于自己编译的.class文件时,如若是第三方 jar 包引起的报错,那么可以使用以下方式
using java -target 1.6 option

以下为intellij IDEA解决此问题的步骤,同样适用于Android Studio 
1、安装 JDK 1.8 
2、更改 java compiler 

打开Settings找到java compiler 
设置project bytecode version:1.8
设置Pre-module bytecode version:对应module的version为1.8

3.更改project sdk
打开project Structure
选中project 设置project SDK为1.8
(如没有1.8选项,请在下方SDKs中添加)
设置project language level:
8-Lambdas,...

4.点击apply,ok完成

IllegalArgumentException解决

最近经常性搞一些老项目,老技术,算是了解经典了
那么在这个过程中经常会出现版本不匹配的问题

例如这次,我电脑上的jdk是1.8的
练习的技术使用的是1.7的,虽无明显报错
但是无法正常执行

启动过程一直报IllegalArgumentException

解决办法,重装jdk1.7

为了不走弯路,希望大家在开发过程中一定不要偷懒,看清楚环境要求

Eclipse启动报错,找不到jvm.dll

启动eclipse报错,根据报错信息显示可知是找不到jdk下的jvm.dll文件
对照报错信息显示的路径我们可以找到对应的文件

这种情况的话就是版本不兼容
打开eclipse.ini通过
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20130521-0416
可知,eclipse为64位

打开cmd执行java -version
如果没有显示bit-64则说明当前jdk为32位

重新下载jdk选择名称带有x64的jdk
带有x86的为32位的jdk

下载安装之后切换JAVA_HOME路径即可

JDK版本降低无效

依照原本安装为jdk1.8降级为jdk1.7无效为例

前提:
1.之前安装jdk版本为1.8
2.重新安装jdk1.7并将JAVA_HOME切换为1.7路径
3.点击确定后打开cmd执行java -version显示还是1.8

解决方案:
1.删除C:\Windows\System32目录下的java.exe、javaw.exe、javaws.exe三个文件
如果没有找到这些文件就跳过
2.删除环境变量Path中C:\ProgramData\Oracle\Java\javapath的配置
把path的值贴出来看一下应该会有这一段的,直接删掉重新查看版本显示1.7