stream流+函数式接口+lambda表达式+Optional

函数式接口

  1. 函数式接口只能有一个抽象方法,
  2. 函数式接口可以有默认的方法default方法和static方法,但抽象方法只能有一个
  3. 函数式接口可以用**@FunctionalInterface**注解进行标注
  4. 可以重写Object内置的方法,比如equals,hashcode等等

lambda表达式

跟js的箭头函数很像。在函数式接口的简化过程中**(参数)->{…方法体}**
匿名内部类的简写方式

方法引入

  1. 静态方法引入: 类名::方法名
  2. 对象方法引入: 类名 :: 实例方法
  3. 实例方法引入: new 对象 对象实例::方法引入
  4. 构造函数引入: 类名::new
    注意点方法引入参数和返回类型必须和函数接口的参数列表和返回类型必须保持一致。

示例

    public static void staticMethod(Integer a){
        System.out.println("我是静态方法:"+a);
    }
    public String getString(String s){
        return "hello world"+s;
    }
    @Test
    public void test5(){
    	//静态方法引入
        ((MessageInterface) TestStream::staticMethod).get(5);
        //实例方法引入
         StringInterface stringInterface = new TestStream() :: getString;
        System.out.println(stringInterface.get("你好"));
        //构造函数引入
          ObjInterface objInterface = User :: new;
        System.out.println(objInterface.get("张三",19));
    }



}
@FunctionalInterface
interface ObjInterface{
    User get(String username,int age);
}
@FunctionalInterface
interface StringInterface{
    String get(String str);
}
@FunctionalInterface
 interface MessageInterface{
    void get(int a);
}

stream流
使用stream的步骤如下:
6. 创建stream;
7. 通过一个或多个中间操作(intermediate operations)将初始stream转换为另一个stream;(filter,distint.sorted,limit…)
8. 通过中止操作(terminal operation)获取结果;该操作触发之前的懒操作的执行,中止操作后,该stream关闭,不能再使用了;(forEach,collect,…)

示例

public class TestStream {


    @Test
    public void test01(){
        List<User> userList = new ArrayList<>();
        userList.add(new User("xiaoming",23));
        userList.add(new User("xiaowang",45));
        userList.add(new User("xiaozhang",65));
        User xiaohei = new User("xiaohei", 15);
        User xiaohong = new User("xiaohei", 15);
        System.out.println(xiaohei.equals(xiaohong));
        userList.add(xiaohei);
//        userList.add(xiaohei);
//
//        Stream<User> stream =
//
        //转换set
        Set<User> userSet = userList.stream().
                collect(Collectors.toSet());
        userSet.forEach(System.out::println);
//
        //转换map
        Map<String, User> userMap = userList.stream().
                collect(Collectors.toMap(User::getUsername, user -> user));
        userMap.forEach((s, user) -> System.out.println(s+","+user));


        //加和
        User sum = userList.stream()
                .reduce((user, user2) -> new User("sum", user.getAge() + user2.getAge())).get();
        System.out.println(sum.getAge());

        //最大值,最小值
        User user = userList.stream().max((o1,o2)->o1.getAge()-o2.getAge()).get();
        System.out.println(user);


        //匹配
        boolean b = userList.stream()
                .allMatch(user1 -> "xiaoming".equals(user1.getUsername()));
        System.out.println(b);

        //过滤
        List<User> collect = userList.stream().
                filter(user2 -> user2.getAge() > 20).
                collect(Collectors.toList());
        collect.forEach(System.out::println);

        //分页
        userList.stream().skip(2).limit(2).forEach(System.out::println);

        //排序
        userList.stream().
                sorted(((o1, o2) -> o1.getAge() - o2.getAge())).
                forEach(System.out::println);

    }

   



}
class User{
    private String username;
    private int age;

    public User() {
    }

    public User(String username, int age) {
        this.username = username;
        this.age = age;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
//        if (this == o) return true;
//        if (o == null || getClass() != o.getClass()) return false;
//        User user = (User) o;
//        return age == user.age &&
//                Objects.equals(username, user.username);

        if (o instanceof User){
            return (username.equals(((User)o).username) && age == ((User)o).age);
        }else {
            return false;
        }
    }

    @Override
    public int hashCode() {
        return username.hashCode();
    }
}

Optional

api

  String username = ".........";
        //ofNullable可以传递空值,of不允许传控制
        Optional<String> op = Optional.ofNullable(username);
        //isPresent判断是否空指
        boolean present = op.isPresent();
        System.out.println(present);

        //设定默认值
        String hello = Optional.ofNullable(username).orElse("hello");
        System.out.println(hello);

        //如果存在即打印
        op.ifPresent(System.out::println);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
团队液体查看器(叉) 这是原始Team Liquid Streams扩展的分支,因为旧的开发人员没有维护/改进现有的扩展。 请在下面的评论部分或以下主题的线程中提出功能请求:http://www.teamliquid.net/forum/viewmessage.php?topic_id=205002 Team Liquid Streams提供了一种在TeamLiquid上观看与Starcraft相关的的简便方法.net它会保持最新列表,列出当前正在媒体的人以及正在观看该媒体的观众人数。 您还可以收藏要在每次再次开始广播时引起弹出式通知的光。 您可以按收藏夹,视频名称,是否推荐,视频类型,种族和观众数进行排序。 现在,该扩展名还按用户名而不是所有者列出,与TeamLiquid.net上的外观匹配。此外,现在还有一个选项屏幕,用于手动编辑您的收藏夹和隐藏列。 更新:现在启用了类型过滤。0.0.2.0版:现在启用了竞赛过滤。0.0.2.5版:添加了一次手动刷新。 刷新是每10分钟一次,此外每10分钟会发生一次自动刷新。 0.0.2.6版:修复了没有种族选择的不会显示的错误。 0.0.2.7版:修复了导致隐藏列时列无法正确移动的错误。 -由Bone_Idle版本0.0.2.8报告:修复了由于标签更改而导致“杂项”不再显示的错误。版本0.0.2.9:添加了“语言等级”列。 默认情况下不显示,并显示所有三种评级类型。 0.0.3.0版:已更新以添加新类型(Dota2和LoL)。 选项页面应该可以再次正常工作。 0.0.3.1版:在选择过滤类型时,类型选择下拉列表保存用于节制的过滤器选择。0.0.3.4版:D3更新0.0.4.0版:HotS和WoL更新用户请求的通知警报现在在选项菜单0.0.4.1版中切换: HotS和WoL的更新-> SC2 Chrome版本0.0.5.0的更新清单版本:输入EoL,因为我目前没有时间维护此版本,并且Google的新Chrome req需要大量重写。 支持语言:English

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值