All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.hutool.core.text.split.SplitIter Maven / Gradle / Ivy

Go to download

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

There is a newer version: 5.8.34
Show newest version
package cn.hutool.core.text.split;

import cn.hutool.core.collection.ComputeIter;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.text.finder.TextFinder;
import cn.hutool.core.util.StrUtil;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

/**
 * 字符串切分迭代器
* 此迭代器是字符串切分的懒模式实现,实例化后不完成切分,只有调用{@link #hasNext()}或遍历时才完成切分
* 此迭代器非线程安全 * * @author looly * @since 5.7.14 */ public class SplitIter extends ComputeIter implements Serializable { private static final long serialVersionUID = 1L; private final String text; private final TextFinder finder; private final int limit; private final boolean ignoreEmpty; /** * 上一次的结束位置 */ private int offset; /** * 计数器,用于判断是否超过limit */ private int count; /** * 构造 * * @param text 文本,不能为{@code null} * @param separatorFinder 分隔符匹配器 * @param limit 限制数量,小于等于0表示无限制 * @param ignoreEmpty 是否忽略"" */ public SplitIter(CharSequence text, TextFinder separatorFinder, int limit, boolean ignoreEmpty) { Assert.notNull(text, "Text must be not null!"); this.text = text.toString(); this.finder = separatorFinder.setText(text); this.limit = limit > 0 ? limit : Integer.MAX_VALUE; this.ignoreEmpty = ignoreEmpty; } @Override protected String computeNext() { // 达到数量上限或末尾,结束 if (count >= limit || offset > text.length()) { return null; } // 达到数量上限 if (count == (limit - 1)) { // 当到达限制次数时,最后一个元素为剩余部分 if (ignoreEmpty && offset == text.length()) { // 最后一个是空串 return null; } // 结尾整个作为一个元素 count++; return text.substring(offset); } final int start = finder.start(offset); // 无分隔符,结束 if (start < 0) { // 如果不再有分隔符,但是遗留了字符,则单独作为一个段 if (offset <= text.length()) { final String result = text.substring(offset); if (false == ignoreEmpty || false == result.isEmpty()) { // 返回非空串 offset = Integer.MAX_VALUE; return result; } } return null; } // 找到新的分隔符位置 final String result = text.substring(offset, start); offset = finder.end(start); if (ignoreEmpty && result.isEmpty()) { // 发现空串且需要忽略时,跳过之 return computeNext(); } count++; return result; } /** * 重置 */ public void reset() { this.finder.reset(); this.offset = 0; this.count = 0; } /** * 获取切分后的对象数组 * * @param trim 是否去除元素两边空格 * @return 切分后的列表 */ public String[] toArray(boolean trim) { return toList(trim).toArray(new String[0]); } /** * 获取切分后的对象列表 * * @param trim 是否去除元素两边空格 * @return 切分后的列表 */ public List toList(boolean trim) { return toList((str) -> trim ? StrUtil.trim(str) : str); } /** * 获取切分后的对象列表 * * @param 元素类型 * @param mapping 字符串映射函数 * @return 切分后的列表 */ public List toList(Function mapping) { final List result = new ArrayList<>(); while (this.hasNext()) { final T apply = mapping.apply(this.next()); if (ignoreEmpty && StrUtil.isEmptyIfStr(apply)) { // 对于mapping之后依旧是String的情况,ignoreEmpty依旧有效 continue; } result.add(apply); } if (result.isEmpty()) { return new ArrayList<>(0); } return result; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy