String b = Stream.of("a1","b2","c3")
.filter(s -> s.matches("b.*"))
.findFirst().get();
System.out.println("b = " + b);
String args[] = {"-a","1","-b","2","-c","3"};
String result = "";
for (int i = 0; i < args.length-1; i++) {
String arg = args[i];
if(arg.matches("-b.*")) {
result= args[i+1];
break;
}
}
System.out.println("result = " + result);
有没有一种简单的方法来使用Java8流来实现这一点呢?例如,给定上面的数组和谓词s->s.matches(“-b*”)
将result设置为“2”。
如果可以获得下一个值,那么在匹配另一个谓词(如s->s.matches(“-c.*”)
)之前,还可以获得下一个N个值或所有值的列表/数组。
这是用流解决这个问题所需要的一种分割器:
import java.util.ArrayList;
import java.util.List;
import java.util.Spliterator;
import java.util.Spliterators.AbstractSpliterator;
import java.util.function.Consumer;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
public class PartitioningSpliterator<E> extends AbstractSpliterator<List<E>>
{
private final Spliterator<E> spliterator;
private final int partitionSize;
public PartitioningSpliterator(Spliterator<E> toWrap, int partitionSize) {
super(toWrap.estimateSize(), toWrap.characteristics());
if (partitionSize <= 0) throw new IllegalArgumentException(
"Partition size must be positive, but was " + partitionSize);
this.spliterator = toWrap;
this.partitionSize = partitionSize;
}
public static <E> Stream<List<E>> partition(Stream<E> in, int size) {
return StreamSupport.stream(new PartitioningSpliterator(in.spliterator(), size), false);
}
@Override public boolean tryAdvance(Consumer<? super List<E>> action) {
final HoldingConsumer<E> holder = new HoldingConsumer<>();
if (!spliterator.tryAdvance(holder)) return false;
final ArrayList<E> partition = new ArrayList<>(partitionSize);
int j = 0;
do partition.add(holder.value); while (++j < partitionSize && spliterator.tryAdvance(holder));
action.accept(partition);
return true;
}
@Override public long estimateSize() {
final long est = spliterator.estimateSize();
return est == Long.MAX_VALUE? est
: est / partitionSize + (est % partitionSize > 0? 1 : 0);
}
static final class HoldingConsumer<T> implements Consumer<T> {
T value;
@Override public void accept(T value) { this.value = value; }
}
}
一旦你把它藏在项目的某个地方,你可以说
partition(Stream.of("-a","1","-b","2","-c","3"), 2)
.filter(pair -> pair.get(0).equals("-b"))
.findFirst()
.map(pair -> pair.get(1))
.orElse("");
作为一个侧重点,提供的分裂器通过依赖abstractspliterator
中trysplit
的默认实现来支持并行性。
问题内容: 我正在使用/ 来获取HTTP响应中的响应代码。返回1,但是尝试获取异常!知道为什么吗? 这是代码: 这是输出: 问题答案: 总是会创建一个新的匹配器,因此您需要再次致电。 尝试:
一旦找到匹配项(在本例中为16),不会立即返回,而是阻塞,直到剩余的线程完成。在这种情况下,调用方在找到匹配项后返回之前将额外等待5秒。
问题内容: 我正在尝试运行python urllib2脚本并收到此错误: InsecurePlatformWarning:真正的SSLContext对象不可用。这会阻止urllib3正确配置SSL,并可能导致某些SSL连接失败。有关更多信息,请参见https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarn
问题内容: 这个问题已经在这里有了答案 : 8年前关闭。 可能重复: Python:如何查找列表交集? 我在.txt中有两个数据列表 我想找出在两个列表中都出现的名字。我该怎么做? 问题答案: 使用集: 该运营商表示“给我这两个集合的交集” 或者,您可以使用以下方法:
问题内容: 由于表示两个字符,因此应使用和‘。但是,为什么和 与正则表达式不匹配? 问题答案: 默认情况下不会产生重叠匹配。但是,此表达式可以: 这是一个前瞻性断言: 如果…下一个匹配,则匹配,但不使用任何字符串。这称为先行断言。例如, 仅在后跟时匹配。