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

com.livk.commons.util.MultiValueMapSplitter Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2021-2024 spring-boot-extension the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.livk.commons.util;

import com.google.common.base.Splitter;
import org.springframework.util.CollectionUtils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;

import java.util.Arrays;
import java.util.Iterator;

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;

/**
 * 用于将字符串拆分成可迭代MultiValueMap对象,是线程安全不可变的
 * 

* {@link com.google.common.base.Splitter.MapSplitter}的补充版 *

* 返回数据是 {@link MultiValueMap} * * @author livk * @see com.google.common.base.Splitter * @see com.google.common.base.Splitter.MapSplitter * @see MultiValueMap */ public final class MultiValueMapSplitter { private static final String INVALID_ENTRY_MESSAGE = "Chunk [%s] is not a valid entry"; private final Splitter outerSplitter; private final Splitter entrySplitter; private MultiValueMapSplitter(Splitter outerSplitter, Splitter entrySplitter) { this.outerSplitter = outerSplitter; // only "this" is passed this.entrySplitter = checkNotNull(entrySplitter); } /** * 静态构造器 * @param outerSplitter the outer splitter * @param entrySplitter the entry splitter * @return the multi value map splitter */ public static MultiValueMapSplitter of(Splitter outerSplitter, Splitter entrySplitter) { return new MultiValueMapSplitter(outerSplitter, entrySplitter); } /** * 静态构造器 * @param outerSplitter the outer splitter * @param entrySplitter the entry splitter * @return the multi value map splitter */ public static MultiValueMapSplitter of(Splitter outerSplitter, String entrySplitter) { return new MultiValueMapSplitter(outerSplitter, Splitter.on(entrySplitter)); } /** * 静态构造器 * @param outerSplitter the outer splitter * @param entrySplitter the entry splitter * @return the multi value map splitter */ public static MultiValueMapSplitter of(String outerSplitter, String entrySplitter) { return new MultiValueMapSplitter(Splitter.on(outerSplitter), Splitter.on(entrySplitter)); } /** * 拆分CharSequence成一个MultiValueMap *

* 示例: String str = "root=1,2,3&root=4&a=b&a=c" *

* MultiValueMapSplitter.of("&", "=").split(str) -> {root=["1,2,3", "4"], a=["b", * "c"]} * @param sequence 待分割的字符串 * @return MultiValueMap */ public MultiValueMap split(CharSequence sequence) { return split(sequence, "^$"); } /** * 拆分CharSequence成一个MultiValueMap *

* 示例: String str = "root=1,2,3&root=4&a=b&a=c" *

* MultiValueMapSplitter.of("&", "=").split(str,",") -> {root=["1", "2", "3", * "4"], a=["b", "c"]} * @param sequence 待分割的字符串 * @param regex value分割符 * @return MultiValueMap */ public MultiValueMap split(CharSequence sequence, String regex) { MultiValueMap map = new LinkedMultiValueMap<>(); for (String entry : outerSplitter.split(sequence)) { Iterator entryFields = entrySplitter.split(entry).iterator(); checkArgument(entryFields.hasNext(), INVALID_ENTRY_MESSAGE, entry); String key = entryFields.next(); checkArgument(entryFields.hasNext(), INVALID_ENTRY_MESSAGE, entry); map.addAll(key, Arrays.asList(entryFields.next().split(regex))); checkArgument(!entryFields.hasNext(), INVALID_ENTRY_MESSAGE, entry); } return CollectionUtils.unmodifiableMultiValueMap(map); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy