Lambda【1】-- List相关Lambda表达式使用(上篇)

Lambda在jdk1.8里面已经很好用了,在这里不讲底层的实现,只有简单的用法,会继续补全。
首先一个list我们要使用lambda的话,需要使用它的stream()方法,获取流,才能使用后续的方法。

基础类User.java

public class User {

  public long userId;

  public User() {
  }

  public User(long userId, String name, int age) {
    this.userId = userId;
    this.name = name;
    this.age = age;
  }

  public String name;
  public int age;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getAge() {
    return age;
  }

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

  public long getUserId() {
    return userId;
  }

  public void setUserId(long userId) {
    this.userId = userId;
  }

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

  public void output() {
    System.out.println("User{" +
        "name='" + name + '\'' +
        ", age=" + age +
        ", userId=" + userId +
        '}');
  }
}

1.遍历元素

使用foreach方法,其中s->里面的s指list里面的每一个元素,针对每一个元素都执行后续的方法。如果里面只有一句话,可以直接缩写foreach(n -> System.out.println(n));,如果需要执行的方法里面有两句或者多句需要执行的话,需要可以使用list.stream().forEach(s -> {System.out.println(s);});形式。

  // 遍历list(String)和对象
  public static void foreachListString() {
    List features = Arrays.asList("Lambdas", "Default Method", "Stream API",
        "Date and Time API");
    features.forEach(n -> System.out.println(n));
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    // s代表的是里面的每一个元素,{}里面就是每个元素执行的方法,这个比较容易理解
    list.stream().forEach(s -> {
      System.out.println(s);
    });

    // 处理对象
    List<User> users = new ArrayList<>();
    User user1 = new User();
    user1.setAge(1);
    user1.setName("user1");
    user1.setUserId(1);
    users.add(user1);
    users.stream().forEach(s -> s.output());
  }

2.转化里面的每一个元素

map是需要返回值的,s代表里面的每一个元素,return 处理后的返回值

public static void mapList() {
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    List<String> list2 = new ArrayList<>();
    // map代表从一个转成另一个,s代表里面的每一个值,{}代表针对每一个值的处理方法,如果是代码句子,则需要有返回值
    // 返回值代表转化后的值,以下两种都可以
    list2 = list.stream().map(s -> {
      return s.toUpperCase();
    }).collect(Collectors.toList());
    list2.stream().forEach(s -> {
      System.out.println(s);
    });
    list2 = list.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());
    list2.stream().forEach(s -> {
      System.out.println(s);
    });
  }

3.条件过滤筛选

使用filter函数,里面的表达式也是需要返回值的,返回值应该为boolean类型,也就是符合条件的就保留在list里面,不符合条件的就被过滤掉。

  // filter过滤
  public static void filterList() {
    List<String> list1 = new ArrayList<>();
    List<String> list2 = new ArrayList<>();
    list1.add("aasd");
    list1.add("agdfs");
    list1.add("bdfh");
    list2 = list1.stream().filter(s -> {
      return s.contains("a");
    }).collect(Collectors.toList());
    list2.stream().forEach(s -> {
      System.out.println(s);
    });
  }

4.取出list里面的对象中的元素,返回一个特定的list

这个可以让我们取出list集合中的某一个元素,也是使用map即可。

  // list集合中取出某一属性
  public static void getAttributeList() {
    List<User> list = new ArrayList<>();
    User user1 = new User();
    user1.setUserId(1);
    user1.setName("James");
    user1.setAge(13);
    list.add(user1);
    User user2 = new User();
    user2.setUserId(2);
    user2.setName("Tom");
    user2.setAge(21);
    list.add(user2);
    // 两种书写方式都可以,一个是map里面,使用每一个实例调用User类的getName方法返回值就是转化后的值。
    List<String> tableNames = list.stream().map(User::getName).collect(Collectors.toList());
    tableNames.stream().forEach(s -> {
      System.out.println(s);
    });
    List<String> tableNames1 = list.stream().map(u -> u.getName()).collect(Collectors.toList());
    tableNames1.stream().forEach(s -> {
      System.out.println(s);
    });
  }

5.分组

可以根据某一个属性来分组,获得map

  // 分组,每一组都是list
  public static void groupBy() {
    List<User> userList = new ArrayList<>();// 存放user对象集合
    User user1 = new User(1, "张三", 24);
    User user2 = new User(2, "李四", 27);
    User user3 = new User(3, "王五", 21);
    User user4 = new User(4, "张三", 22);
    User user5 = new User(5, "李四", 20);
    User user6 = new User(6, "王五", 28);
    userList.add(user1);
    userList.add(user2);
    userList.add(user3);
    userList.add(user4);
    userList.add(user5);
    userList.add(user6);
    //根据name来将userList分组
    Map<String, List<User>> groupBy = userList.stream().collect(Collectors.groupingBy(User::getName));
    System.out.println(groupBy);
  }

6.对某一个属性进行求和

比如我们需要对年龄进行求和,可以使用mapToInt(),里面参数应该使用类名:方法名,最后需要使用sum()来求和。

public static void getSum(){
    List<User> userList = new ArrayList<>();//存放user对象集合

    User user1 = new User(1, "qw", 24);
    User user2 = new User(2, "qwe", 27);
    User user3 = new User(3, "aasf", 21);
    User user4 = new User(4, "fa", 22);
    User user5 = new User(5, "sd", 20);
    User user6 = new User(6, "yr", 28);

    userList.add(user1);
    userList.add(user2);
    userList.add(user3);
    userList.add(user4);
    userList.add(user5);
    userList.add(user6);
    // sum()方法,则是对每一个元素进行加和计算
    int totalAge = userList.stream().mapToInt(User::getAge).sum();
    System.out.println("和:" + totalAge);
  }

7.将list转化成map

比如我们需要list里面的对象的id和这个对象对应,那就是需要转换成map。需要在collect()方法里面使用Collectors的toMap()方法即可,参数就是key和value。

 public static void listToMap(){
    List<User> userList = new ArrayList<>();

    User user1 = new User(1, "12", 22);
    User user2 = new User(2, "21", 17);
    User user3 = new User(3, "a", 11);
    User user4 = new User(4, "a", 22);
    User user5 = new User(5, "af", 22);
    User user6 = new User(6, "fa", 25);

    userList.add(user1);
    userList.add(user2);
    userList.add(user3);
    userList.add(user4);
    userList.add(user5);
    userList.add(user6);

    Map<Long,User> userMap = userList.stream().collect(Collectors.toMap(User::getUserId, user -> user));
    System.out.println("toMap:" + userMap.toString());
  }

此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~

技术之路不在一时,山高水长,纵使缓慢,驰而不息。

公众号:秦怀杂货店

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容