java 随笔 stream api

java 随笔 stream api,第1张

0. 赶紧写完,我要剪头发…

【RUNOOB】Java 8 Stream
【CSDN】java stream中Collectors的用法
【CSDN】java8 Stream的flatMap的使用
【JB51】Java8的Stream()与ParallelStream()的区别说明


gitee中的sample code

1. sample code
// 一个自己封装的json转换工具类而已,无需多虑...
import com.weng.cloud.commons.JsonUtil;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * @Author: weng
 * @Date: 2022/5/8
 * @Description: 说真的,很像 flink stream api ...
 *
 * @see 【RUNOOB】Java 8 Stream
 * @see 【CSDN】java stream中Collectors的用法
 * @see 【CSDN】java8 Stream的flatMap的使用
 * @see 【JB51】Java8的Stream()与ParallelStream()的区别说明
 */

public class TestStreamApi {

    private final static List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl","bc");
    private final static List<Person> persons = Arrays.asList(
            Person.builder().no(6).name("james").build(),
            Person.builder().no(8).name("williams").build(),
            Person.builder().no(7).name("kd").build(),
            Person.builder().no(8).name("kobe").build(),
            Person.builder().no(35).name("kd").build()
    );

    public static void main(String[] args) {

        //testForEach(testMap());
//        testForEach(strings.stream());

//        testFilter();
//        testForEach(strings.stream());
        //testForEach(testFilter());

        //testIntStream().forEach(System.out::println);

        testCollect();
    }

    /**
     * 
function: 没有返回值 *
tip: * * @param: [stream] * @return: void * @author: weng * @date: 2022/5/8 11:48 */
static void testForEach(Stream<String> stream){ stream.forEach(System.out::println); } static Stream<String> testMap(){ // 返回的是副本 return strings .stream() .map(v->"map前缀 -> "+v) ; } static Stream<String> testFilter(){ return strings .stream() // :: 相当于 (ele) -> {},即lambda表达式 // 相当于需要一个 boolean 作为 filter 的参数 .filter(StringUtils::isNotBlank) ; } /** *
function: IntStream 概念类似 Stream *
tip: 实际并不是stream子类,基本类型还是有些区别的 * * All Superinterfaces: * AutoCloseable, BaseStream < Integer, IntStream > * * @param: [] * @return: java.util.stream.IntStream * @author: weng * @date: 2022/5/8 11:57 */
static IntStream testIntStream(){ return new Random() //元素个数 // 这波 *** 作同 .ints(10) .ints() .limit(10) .sorted() ; } static void testCollect(){ /* LinkedList ll = strings .stream() .collect( // 感觉在归约前做处理(map)不是很好 // 一般都是在上游先map吧... */ /* Collectors.mapping( ele -> ele.toUpperCase(), //joining 就是返回一段字符串 Collectors.joining(",","【","】") ) *//* //注意hashset不是原序的 //Collectors.toSet() //值得注意的是返回类型是LinkedList // 但是编译时会以为是Collection,直接输出会报错 Collectors.toCollection(LinkedList::new) ) ; System.out.println(ll); */ Map<Integer,String> personMap = persons .stream() .collect( Collectors.collectingAndThen( //do collecting Collectors.toMap( // stream中有重复的值,则转换会报IllegalStateException异常 // 返回值本身 //Function.identity(), //Function::identity Person::getNo, Person::getName, //第三个参数mergeFunction,来解决冲突的问题 //java.util.function.BiFunction.apply //入参是两个value (item, identicalItem) -> item.length() < identicalItem.length() ? item : identicalItem ), //then... map -> { map.put(0,"westbrook"); return map; } //这个故事告诉我们,跟stream相关的 *** 作都是副本的 /* map -> { map.forEach((k,v)->{ //v = v.concat("(长度"+v.length()+")"); v = "1"; }); return map; } */ ) ) ; personMap.forEach((k,v)->System.out.println("key="+k+",value="+v)); System.err.println("map元素个数->"+ personMap.values().stream().count()); System.err.println("key的总和->"+ personMap .keySet() .stream() .collect( Collectors.summingInt(value -> value) // 返回的结果是一个统计类: // IntSummaryStatistics{count=5, sum=56, min=0, average=11.200000, max=35} //Collectors.summarizingInt(value -> value) // 平均值 //Collectors.averagingInt(value -> value) // 最值 // 这种情况下返回的结果是Optional[最大的元素] /* Collectors.maxBy( //Comparator.naturalOrder() (o1, o2) -> Math.max(obtainPreInt(o1),obtainPreInt(o2)) ) */ ) ); //Map<分组key,分组后的集合Collection> //像下面这个样例,将返回Map> System.err.println("分组后的Map -> "+persons .stream() .collect( Collectors.groupingBy( Person::getName, Collectors.toSet() ) ) ); //分组可以理解为特殊的分组 //分组将产生一个Map<过滤条件Boolean,分区后的集合Collection> Map<Boolean, Map<String, Integer>> partitionedMap = persons .stream() .collect( Collectors.partitioningBy( Person::isNoOverTen, Collectors.toMap( Person::getName, Person::getNo ) ) ) ; System.err.println("分区后的Map -> "+partitionedMap); System.err.println("降维后的map -> "+ JsonUtil.toJson(partitionedMap .values() .stream() .flatMap(map -> map.keySet().stream()) //stream -> array .toArray() ) ); } /** *
function: 获取整数中最大一位 *
tip: * * @param: [s] * @return: int * @author: weng * @date: 2022/5/8 14:24 */
private static int obtainPreInt(int i){ return Integer.parseInt(String.valueOf(i).substring(0,1)); } } @Data @AllArgsConstructor @Builder //必须要除Object以外的显式父类才能调用父类的... //@EqualsAndHashCode(callSuper = true) class Person implements Serializable { Integer no; String name; @Override public String toString() { return JsonUtil.toJson(this); } /** *
function: 球衣号码是否两位数 *
tip: * * @param: \ * @return: boolean * @author: weng * @date: 2022/5/8 14:43 */
public boolean isNoOverTen(){ return this.no >= 10; } }

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/876772.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存