首页 > 其他分享 >lambda必须要会的十种姿势

lambda必须要会的十种姿势

时间:2024-07-06 17:20:30浏览次数:13  
标签:Arrays 十种 List SumAndProduct new 要会 public asList lambda

  • flatmap 的使用

处理嵌套,一般是二维数组(集合)

import java.util.*;
import java.util.stream.*;

class Book {
    private List<Chapter> chapters;

    public Book(List<Chapter> chapters) {
        this.chapters = chapters;
    }

    public List<Chapter> getChapters() {
        return chapters;
    }
}

class Chapter {
    private List<String> paragraphs;

    public Chapter(List<String> paragraphs) {
        this.paragraphs = paragraphs;
    }

    public List<String> getParagraphs() {
        return paragraphs;
    }
}

public class FlatMapExample {
    public static void main(String[] args) {
        List<Book> books = Arrays.asList(
                new Book(Arrays.asList(
                        new Chapter(Arrays.asList("Paragraph 1.1", "Paragraph 1.2")),
                        new Chapter(Arrays.asList("Paragraph 1.3"))
                )),
                new Book(Arrays.asList(
                        new Chapter(Arrays.asList("Paragraph 2.1")),
                        new Chapter(Arrays.asList("Paragraph 2.2", "Paragraph 2.3"))
                ))
        );

        List<String> allParagraphs = books.stream()
                .flatMap(book -> book.getChapters().stream())
                .flatMap(chapter -> chapter.getParagraphs().stream())
                .collect(Collectors.toList());

        System.out.println(allParagraphs);
    }
}

嵌套List

List<List<String>> list = dogetXidsForTargetMap(stringLongMap, start, end, pageSize);
List<String> xids = list.stream().flatMap(Collection::stream).collect(Collectors.toList());
  • map和reduce
import java.util.Arrays;
import java.util.List;

class SumAndProduct {
    private int sum;
    private int product;

    public SumAndProduct(int sum, int product) {
        this.sum = sum;
        this.product = product;
    }

    public SumAndProduct add(int value) {
        return new SumAndProduct(this.sum + value, this.product * value);
    }

    public SumAndProduct combine(SumAndProduct other) {
        return new SumAndProduct(this.sum + other.sum, this.product * other.product);
    }

    @Override
    public String toString() {
        return "Sum: " + sum + ", Product: " + product;
    }
}

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        SumAndProduct result = numbers.stream()
                .reduce(
                        new SumAndProduct(0, 1),         // 初始值
                        (partialResult, number) -> partialResult.add(number), // 累加器
                        SumAndProduct::combine           // 组合器
                );

        System.out.println(result);
    }
}
  • suplier
loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, loginUser.getPassword()));

    /**
     * 登录校验
     */
    public void checkLogin(LoginType loginType, String tenantId, String username, Supplier<Boolean> supplier) {
        String errorKey = GlobalConstants.PWD_ERR_CNT_KEY + username;
        String loginFail = Constants.LOGIN_FAIL;
        Integer maxRetryCount = userPasswordProperties.getMaxRetryCount();
        Integer lockTime = userPasswordProperties.getLockTime();

        // 获取用户登录错误次数,默认为0 (可自定义限制策略 例如: key + username + ip)
        int errorNumber = ObjectUtil.defaultIfNull(RedisUtils.getCacheObject(errorKey), 0);
        // 锁定时间内登录 则踢出
        if (errorNumber >= maxRetryCount) {
            recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
            throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
        }

        if (supplier.get()) {
            // 错误次数递增
            errorNumber++;
            RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime));
            // 达到规定错误次数 则锁定登录
            if (errorNumber >= maxRetryCount) {
                recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime));
                throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime);
            } else {
                // 未达到规定错误次数
                recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber));
                throw new UserException(loginType.getRetryLimitCount(), errorNumber);
            }
        }

        // 登录成功 清空错误次数
        RedisUtils.deleteObject(errorKey);
    }
  • consumer
RedisUtils.publish(key, value, consumer -> {
            System.out.println("发布通道 => " + key + ", 发送值 => " + value);
        });

/**
     * 发布通道消息
     *
     * @param channelKey 通道key
     * @param msg        发送数据
     * @param consumer   自定义处理
     */
    public static <T> void publish(String channelKey, T msg, Consumer<T> consumer) {
        RTopic topic = CLIENT.getTopic(channelKey);
        topic.publish(msg);
        consumer.accept(msg);
    }

 

标签:Arrays,十种,List,SumAndProduct,new,要会,public,asList,lambda
From: https://www.cnblogs.com/clarencezzh/p/18287497

相关文章

  • Lambda表达式
    1.基本用法        lambda表达式是C++11最重要也是最常用的特性之一,这是现代编程语言的一个特点,lambda表达式有如下的一些优点:声明式的编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或函数对象。简洁:避免了代码膨胀和功能分散,让开发更加高效。在......
  • 关于自定义unordered_set\unordered_map中Hash和KeyEqual:函数对象和lambda表达式简单
    以unordered_set为例,首先在cppreference中查看其模板定义:可以看到Hash类默认是std::hash<Key,KeyEqual类似,本文将Hash以函数对象写出,将KeyEqual以lambda写出。classhashvec{ public: size_toperator()(constvector<int>&vec)const{ returnhash<int>()(vec[0])+hash......
  • 55、Flink 中使用 Java Lambda 表达式详解
    1)概述1.注意Flink支持对JavaAPI的所有算子使用Lambda表达式,但是,当Lambda表达式使用Java泛型时,需要显式地声明类型信息。2.示例和限制示例:map()函数使用Lambda表达式计算输入值的平方。不需要声明map()函数的输入i和输出参数的数据类型,因为Java编......
  • Java知识点整理 18 — Lambda表达式
    一.简介Lambda表达式是函数式编程思想的体现,强调做什么,而不是以什么方式去做。面向对象编程思想强调的是对象,必须通过对象的形式来做一些事情。比如多线程执行任务,需要创建对象,对象需要实现指定接口,然后再执行等。过程相对繁琐。而如果使用函数式编程思想,可以直接通过传递......
  • Lambda表达式可并行性
    今天补充Lambda表达式知识的时候,有一个可并行性的特性://使用Lambda表达式和StreamAPI进行并行计算List<Integer>numbers=Arrays.asList(1,2,3,4,5);intsum=numbers.parallelStream().mapToInt(Integer::intValue).sum();上面的代码中,使用Lambda表达式结合了S......
  • 学懂C#编程:常用高级技术——委托(Delegate)应用场景——委托与Lambda表达式的结合使用详
            在C#中,委托与Lambda表达式的结合使用是现代编程实践中的一个重要且强大的特性,它极大地提高了代码的简洁性和可读性。下面将详细讲解这两个概念如何协同工作,以及如何在实际编程中有效利用它们。委托基础        委托是C#中的一种引用类型,它允许封装一......
  • Java Lambda 表达式中为何不能访问局部定义的变量?
    问题展示代码:publicstaticvoidtest01(){Stringstr="str";newThread(()->{str+="yes";System.out.println(str);}).start();}在jdk1.8下,在lambda表达式中访问str,编译器未报错;提示我不可访问非f......
  • 关于zip、map、filter和lambda函数
    zip#相当于是拉链,将两个列表对应位置的数据拉到一起,变成元组,最后返回一个迭代器。用list将迭代器转换为列表即可看到内容#如果列表数据长度不对等,就以短的为主,剩下的不管了list1=[1,2,3]list2=['a','b','c','d']z=zip(list1,list2)print(list(z))#>>>>输......
  • 【Lambda、SteamAPI】谨慎使用流
    由于Java不支持基本类型的char流,因此在运行下面这样的代码时,会出现问题publicstaticvoidmain(String[]args){"HelloWorld".chars().forEach(System.out::println);//预期打印HelloWorld//实际打印一串数字}chars()返回的流是int值不是char值。因......
  • Lambda表达式:会这10招
    引言在Java8之前,Java的语法相对冗长,尤其是在处理集合操作和多线程编程时,常常需要大量的样板代码。自Java8引入Lambda表达式以来,Java编程变得更加简洁和高效,不仅减少了代码量,还提升了代码的可读性和可维护性。今天就来聊聊几种工作中很常用的Lambda表达式应用场景,走过路过别错......