首页 > 编程语言 >20221201 java.util.Spliterator

20221201 java.util.Spliterator

时间:2022-12-01 10:11:10浏览次数:56  
标签:java System spliterator util Spliterator println public out

java.util.Spliterator

基本信息

  • public interface Spliterator<T>
  • rt.jar
  • 引入版本:8
  • 相关类:
    • java.util.Collection
    • java.lang.Iterable
    • java.util.Spliterators :工具类

使用说明

  • 可分割迭代器
  • 并行遍历
  • 配合并行流在底层执行,一般不需要自己实现

静态常量

静态常量
public static final int ORDERED = 0x00000010;
顺序
public static final int DISTINCT = 0x00000001;
非重复
public static final int SORTED = 0x00000004;
排序
public static final int SIZED = 0x00000040;
数量
public static final int NONNULL = 0x00000100;
非空
public static final int IMMUTABLE = 0x00000400;
不可修改
public static final int CONCURRENT = 0x00001000;
可并发
public static final int SUBSIZED = 0x00004000;
子 Spliterator 都将是 SIZED

这些常量定义的是 Spliterator 的特征,可以组合使用

某些特征值不能兼容,如果同时具有,那么不能保证 Spliterator 的行为

配合方法 characteristicshasCharacteristics 使用

接口定义方法

接口定义方法
boolean tryAdvance(Consumer<? super T> action);
如果存在剩余元素,则对其执行给定的操作,返回 true ;否则返回 false 。
如果此 Spliterator 是 ORDERED ,则按遇到顺序对下一个元素执行操作。
default void forEachRemaining(Consumer<? super T> action)
在当前线程中按顺序对每个剩余元素执行给定操作,直到处理完所有元素或操作引发异常。如果此 Spliterator 是 ORDERED ,则将按遇到顺序执行操作。
Spliterator<T> trySplit();
对 Spliterator 进行拆分
long estimateSize();
返回 forEachRemaining 遍历将遇到的元素数量的估计值,或者如果无限、未知或计算成本太高则返回 Long.MAX_VALUE 
如果具有特征 SIZED 或 SUBSIZED ,必须返回准确数量
default long getExactSizeIfKnown()
如果此 Spliterator 为 SIZED 则返回 estimateSize() 的结果,否则返回 -1
int characteristics();
返回具有的特征值
default boolean hasCharacteristics(int characteristics)
判断是否具有特征值
default Comparator<? super T> getComparator()
如果具有特征 SORTED ,返回相应的 Comparator ;
如果是自然排序,返回 null 
如果不具有特征 SORTED ,抛出异常 IllegalStateException

示例代码

package study.hwj._spliterator;

import cn.hutool.core.collection.ListUtil;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.SortedSet;
import java.util.Spliterator;
import java.util.TreeSet;
import java.util.stream.IntStream;

/**
 * _spliterator
 *
 * @author owenwjhuang
 * @date 2022/12/1
 */
public class Test1 {
    @Test
    public void testBinary() {
        System.out.println(0b10);   // 2, 2进制表示法
        System.out.println(010);    // 8, 8进制表示法
        System.out.println(10);     // 10, 10进制表示法
        System.out.println(0x10);    // 16, 16进制表示法

        System.out.println(Integer.toBinaryString(0x10));   // 10000, 数字转2进制
        System.out.println(Integer.toOctalString(10));      // 12, 数字转2进制
        System.out.println(Integer.toHexString(10));        // 10000, 数字转2进制
    }

    @Test
    public void testCharacteristics() {
        ArrayList<Integer> arrayList = new ArrayList<>();
        Spliterator<Integer> spliterator = arrayList.spliterator();
        System.out.println(spliterator.characteristics());      // 16464 ,十进制表示,没什么意义
        System.out.println(
                Integer.toHexString(spliterator.characteristics()));     // 十六进制表示,对比Spliterator里的静态常量,使用加法,可以知道具有哪些特征
        System.out.println(spliterator.hasCharacteristics(Spliterator.SIZED));
        System.out.println(spliterator.hasCharacteristics(Spliterator.SUBSIZED));
        System.out.println(spliterator.hasCharacteristics(Spliterator.ORDERED));
        // 参考代码验证 java.util.ArrayList.ArrayListSpliterator.characteristics


    }


    @Test
    public void testComparator() {
        ArrayList<Integer> arrayList = new ArrayList<>();
        Spliterator<Integer> spliterator = arrayList.spliterator();
        // Comparator<? super Integer> comparator = spliterator.getComparator();   // 抛出异常

        SortedSet<Integer> sortedSet = new TreeSet<>();
        Comparator<? super Integer> comparator1 = sortedSet.spliterator().getComparator();
        System.out.println(comparator1);    // null
    }

    @Test
    public void testIterate() {
        ArrayList<Integer> arrayList = ListUtil.toList();
        for (int i = 0; i < 100; i++) {
            arrayList.add(i);
        }
        Spliterator<Integer> spliterator = arrayList.spliterator();

        spliterator.tryAdvance(System.out::println);    // 0

        System.out.println("****************************");

        spliterator.forEachRemaining(System.out::println);      // 1-99
    }

    @Test
    public void testSplit() {
        ArrayList<Integer> arrayList = ListUtil.toList();
        for (int i = 0; i < 100; i++) {
            arrayList.add(i);
        }
        Spliterator<Integer> spliterator = arrayList.spliterator();

        Spliterator<Integer> subSpliterator = spliterator.trySplit();
        subSpliterator.forEachRemaining(System.out::println);       // 0-49

        System.out.println("****************************");

        spliterator.forEachRemaining(System.out::println);          // 50-99
    }

    @Test
    public void testParallel() {
        IntStream.range(0, 100).parallel().peek(System.out::println).count();
        // 通过断点调试,发现执行到了方法
        // java.util.stream.Streams.RangeIntSpliterator.trySplit
    }


}

参考资料

标签:java,System,spliterator,util,Spliterator,println,public,out
From: https://www.cnblogs.com/huangwenjie/p/16940562.html

相关文章

  • 这么简单,还不会使用java8 stream流的map()方法吗?
    一、前言在日常的开发工作中经常碰到要处理list中数据的问题,比如从数据库中查出了很多学生,由于一些原因需要在内存中找出这些学生中的所有姓名,或者把名为“王五”的语文成......
  • java将视频转换为gif动图
    一、依赖<dependency><groupId>ws.schild</groupId><artifactId>jave-nativebin-win64</artifactId><version>3.1.1</version></dep......
  • java XML对象互转 注解实例
    javaJAXB@XmlAttribute@XmlElement@XmlValue实例@XmlAttribute 用法@Data@XmlAccessorType(XmlAccessType.FIELD)publicstaticclassCouponOther{@XmlEle......
  • java扫描操作部分文件
    java扫描操作部分文件 publicvoidfindStrFromManyFiles(StringdirName,StringendStr)throwsIOException{Filedir=newFile(dirName);File[]files......
  • Java HashMap 在获得 Key 的 Hash 值的时候用的是什么算法
    Java在HashMapKey的Hash值的时候用的的是自己Object中的hashCode()算法。返回的结果是一个整数值。如果你查看JDK的源代码的话,在HashMap类中会有下面的这......
  • Java Hash 碰撞
    散列函数(英语:Hashfunction)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下......
  • Java HashMap 的扩容因子为什么是 0.75
    所谓的加载因子,也叫扩容因子或者负载因子,它是用来进行扩容判断的。假设加载因子是0.5,HashMap初始化容量是16,当HashMap中有16*0.5=8个元素时,HashMap就会进行扩容操作。......
  • JavaWeb项目练习(学生选课管理系统)一
    打算做一个选课管理系统,作为期末的复习。上需求2.1页面要求(1)系统可以通过浏览器直接访问;(1分)(2)各个功能页面整体风格统一;(2分)(3)首页为用户登录页面,管理员、教师、学生三......
  • java 02
    java变量&数组&标准输入输出&运算符&String~~有出错的地方,我会及时改正owo~~标识符(好像包含关键字)命名规则标识符由字母、数字、下划线、美元等(比如中文也可以但不是......
  • 这回终于把Java类中Serialversionuid 作用讲的明明白白了
    实现Serializable接口的目的是为类可持久化,比如在网络传输或本地存储,为系统的分布和异构部署提供先决条件。若没有序列化,现在我们所熟悉的远程调用,对象数据库都不可能存在,......