Java高级特性——Stream流+异常+其他特性


本文介绍jdk8之后的一些新技术和异常,相关内容可以查看以前的博文: 添加链接描述

Stream流体系

作用:简化集合和数组操作的API

//过滤数组中第一个字母为张并且字母长度为3的名字
names.stream().filter(s->s.startsWith("张")).filter(s->s.length()==3);

核心思想
(1)先得到集合或者数组的Stream流(就是一根传送带)
(2)把元素放上去
(3)然后就用这个Stream流简化的API来方便的操作元素
操作规范

Stream流的三种方法

(1) 获取stream流:创建一条流水线,并把数据放到流水线上进行操作。

List<String> l=new Arraylist<>();
Stream<String> s=l.stream();

Map<String,Integer> maps=new Hashmap<>();
Stream<String> keystream=maps.keySet.stream();
Stream<Integer> value=maps.values.stream();
Stream<<Map,Entry<String,Integer>> keyvalue=maps.entrySet().stream();

//数组拿stream流
Stream<String> nameStream=Array.stream(names);
Stream<String> nameStream=Stream.of(names);

(2)中间方法:流水线上的操作,一次操作完成之后,还可以进行另外的操作。

代码属性
filter对流中元素进行过滤
limit获取前几个元素
skip()跳过前几个元素
distinct()去除流中重复的元素
concat(Stream a,Stream b)合并流a和流b
list.stream().filter(s->s.startwith("张")).foreach(s->System.out.println(s));

long size=list.stream().filter(s->s.size==3).count();

list.stream().filter(s->s.startWith("张")).limit(2).forEach(System.out::println);
//当方法中s->System.out.println(s)参数相同可以使用方法引用.

//map加工方法:第一个参数是原材料,第二个参数是加工后的材料
list.stream().map(s->"黑马的"+s).forEach(System.out::println);
//把原来的名称加工成对象
list.stream().map(s ->new student(s)).forEach(System.out::println);

中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程。在Stream流中无法直接修改集合、数组中的数据。

(3)终结方法:一个stream流只能有一个终结方法,是流水线上最后一个操作。

代码属性
void forEach()对流中的每个元素遍历
int count()返回流中的元素数

终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了。

收集stream流

代码属性
toList()把元素收集到list集合
toSet()把元素收集到set集合
toMap()把元素收集到Map集合中

异常

基本含义:异常是程序在“编译”或者“执行”的过程中可能出现的问题,语法错误不算在异常体系中。 比如:数组索引越界、空指针异常、 日期格式化异常。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

处理异常方式

编译时异常

默认处理throws

(1)默认会在出现异常的代码那里自动的创建一个异常对象:ArithmeticException。
(2)异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机。
(3)虚拟机接收到异常对象后,先在控制台直接输出异常栈信息数据。
(4)直接从当前执行的异常点干掉当前程序。
(5)后续代码没有机会执行了,因为程序已经死亡。
在这里插入图片描述

方法 throws 异常1 ,异常2 ,异常3 ..{}
//用在方法上,可以把方法内部出现的异常抛出给本方法的调用者
方法 throws Exception{}

缺点:这种方式并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡。

try-catch
  try{       
  // 监视可能出现异常的代码!   
  }catch(异常类型1 变量){       
    // 处理异常   }
  catch(异常类型2 变量){     
    // 处理异常   }
标准写法:
   try{    // 可能出现异常的代码!}
     catch (Exception e){   
      e.printStackTrace(); // 直接打印异常栈信息
     }
Exception可以捕获处理一切异常类型
方法直接将异通过throws抛出去给调用者,调用者收到异常后直接捕获处理。

运行时异常处理

建议在最外层调用处集中捕获处理即可。

自定义异常

自定义编译时异常

(1)定义一个异常类继承Exception.
(2) 重写构造器。
(3)在出现异常的地方用throw new 自定义对象抛出,
作用:编译时异常是编译阶段就报错,提醒更加强烈.!

自定义运行时异常

(1)定义一个异常类继承RuntimeException.
(2)重写构造器。
(3)在出现异常的地方用throw new 自定义对象抛出!

其他特性

可变参数

作用:可变参数用在形参中可以接收多个数据。
格式:数据类型...参数名称
好处:传输参数非常灵活,方便。可以不传输参数,可以传输1个或者多个,也可以传输一个数组
本质:数组
注意:
1.一个形参列表中可变参数只能有一个
2.可变参数必须放在形参列表的最后面

static应用:工具类+代码块+单例

工具类:里面是一些静态方法,每个方法都是为完成一个公用的功能。
工具类不需要创建对象,直接调用类名访问即可,我们可以把工具类中的构造器私有化。

public class staticWay {
    private staticWay(){
    }
    public static String createCode(int n)
    {
        String code="";
        String data="abcdefghigklmnopqrstuvwxyz";

        Random r=new Random();
        for(int i=0;i<n;i++)
        {
            //获取随机索引对应的字符,连接给code
            int index=r.nextInt(data.length());
            code+=data.charAt(index);
        }
        return code;
    }
}

代码块:类的五大组成之一(成员变量+构造器+方法+代码块+内部类)定义在类中方法外。在Java类下,用{}括起来的代码。
1.静态代码块:static{}
随着类的加载而加载并且自动触发执行,只执行一次。
初始化类内的静态资源
2.构造代码块:{}(不多用)
每次创建对象的时候,调用构造器的执行前,就会先执行该代码块中的代码,用于初始化实例变量。

单例模式
(1)开发中遇到的问题可能有n种解法,其中最优的解法被称为设计模式。
(2)单例模式:保证系统应用该模式的这个类永远只有一个实例,一个类创建一个对象,可以节省空间。
(3)饿汉单例设计模式:用类获取对象的时候,对象已经创建好了

  • 定义一个类私有构造器
  • 定义静态变量存储一个对象
public class SingleMan {
  public static SingleMan instance=new SingleMan();
  private SingleMan(){
    }
 }
//主函数中:
SingleMan s=SingleMan.instance;

(4)懒汉单例设计模式:真正需要该对象的时候才去创建对象(延迟加载对象)

  • 定义一个类私有构造器
  • 定义一个静态变量存储一个对象
public class SingleMan  {
 //定义一个静态成员变量存储一个对象只加载一次
  public static SingleMan instance;
  private SingleMan (){
  }
  //定义一个方法,对外返回单例对象
  public static SingleMan getInstance(){
   if(instance==null){
    //第一次来拿对象需要创建
    instance=new SingleMan ();
    }
    return instacnce;
    }
  }
  //主函数中:
SingleMan s=SingleMan.getInstance();

接口新增方法

如何在丰富接口功能的同时又不对子类代码进行更改:允许接口中定义带有方法体的方法。

//默认方法:必须用default修饰,默认是public修饰(实例方法)
//过继给实现类,让实现类对象调用
   default void run(){
   }
 //静态方法:接口的静态方法,必须用接口来调用
  static void run(){
 }
 //私有方法:必须在接口的内部才能访问
 private void run(){
  }

正则表达式

1.正则表达式可以用一些规定的字符来指定规则,用来校验数据格式的合法性。
2.匹配规则:
请添加图片描述3.在方法中的应用:

String replaceAll(String regex,String newStr)按照正则表达式匹配的内容进行替换
String[] spilt(String regex)按照正则表达式匹配的内容分割字符串,返回一个字符串数组

4.正则表达式爬取信息
在这里插入图片描述

不可变集合

  • 不可以被修改的集合,集合的数据项在创建的时候提供,并且在整个生命周期不可以被修改。
  • 原因:如果某个数据不可以被修改,把它防御性拷贝到不可变集合很不错+当集合对象被不可信的库调用时不可变形式是安全的。
  • 创建方法:
static list of(element)创建一个指定元素的list集合对象
static set of(element)创建一个具有指定元素的set集合对象
static map of(element)创建一个具有指定元素的map集合对象
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太一TT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值