当前位置: 首页 > 知识库问答 >
问题:

如何在使用流API的函数更改字符串变量时跟踪它?

田彬郁
2023-03-14

我想使用Stream API在使用函数更改变量时跟踪变量。

我的代码:

public String encoder(String texteClair) {
    for (Crypteur crypteur : algo) {
        texteClair = crypteur.encoder(texteClair);
    }
    return texteClair;
}

我有一个包含方法的类列表,我想在所有这些类中放入一个变量,就像上面代码中所做的那样。

它工作得很好,但我想知道如何用流来完成?

我们可以使用reduce()

共有2个答案

裴俊雅
2023-03-14

我们可以使用reduce()

我想我们可以。但请记住,使用流并不是最好的情况。

因为您提到了复数形式的“类”,所以我假设Crypteur要么是抽象类,要么是接口。一般来说,你应该更喜欢接口而不是抽象类,所以我假设Crypteur是一个接口(如果不是,这不是一个大问题),并且它至少有一个类似的实现:

public interface Encoder {
    String encoder(String str);
}

public class Crypteur implements Encoder {
    private UnaryOperator<String> operator;
    
    public Crypteur(UnaryOperator<String> operator) {
        this.operator = operator;
    }
    
    @Override
    public String encoder(String str) {
        return operator.apply(str);
    }
}

然后,你可以利用你的编码器和流如下:

public static void main(String[] args) {
    List<Crypteur> algo =
        List.of(new Crypteur(str -> str.replaceAll("\\p{Punct}|\\p{Space}", "")),
                new Crypteur(str -> str.toUpperCase(Locale.ROOT)),
                new Crypteur(str -> str.replace('A', 'W')));
    
    String result = encode(algo, "Every piece of knowledge must have a single, unambiguous, authoritative representation within a system");

    System.out.println(result);
}

public static String encode(Collection<Crypteur> algo, String str) {
    return algo.stream()
        .reduce(str,
            (String result, Crypteur encoder) -> encoder.encoder(result),
            (result1, result2) -> { throw new UnsupportedOperationException(); });
}

请注意,combiner(用于并行合并部分结果)故意抛出异常,以指示此任务不可并行化。所有转换都必须按顺序应用,例如,我们不能在给定字符串上应用一些编码器,然后在给定字符串上分别应用其余的编码器,并合并两个结果——这是不可能的。

输出

EVERYPIECEOFKNOWLEDGEMUSTHWVEWSINGLEUNWMBIGUOUSWUTHORITWTIVEREPRESENTWTIONWITHINWSYSTEM
翟淮晨
2023-03-14

使用原子引用,它实际上是最终的,但其包装值可能会发生变化:

public String encoder(String texteClair) {
    AtomicReference<String> ref = new AtomicReference<>(texteClair);
    algo.stream().forEach(c -> ref.updateAndGet(c::encoder)); // credit Ole V.V
    return ref.get();
}
 类似资料:
  • 问题内容: 我需要能够调用一个函数,但是函数名称存储在变量中,这可能吗?例如: 问题答案: 要么

  • 尝试解决问题 http://www.hackerearth.com/problem/algorithm/sum-of-medians-1/ 并考虑使用多集来解决它,因为它可能包含重复的值。我尝试按如下方式编写代码:

  • 问题内容: 我的同事在工作中提出了一个我无法回答的问题(由于缺乏经验),该问题与跟踪表中相关字段的变化有关。 想象一下,我们有3个表,每个表20个字段。在此示例中,我们考虑这些表中的每一个都有2个字段,一个名为LastUpdatedOn,另一个名为LastUpdatedBy。 如果我们只想跟踪这3个表中的更改,而只跟踪几个特定字段,而没有为每个表创建包含更新前最新版本的历史表,那么我们如何跟踪这些

  • 我有这个变量: 通过单击按钮,我执行此功能: 变量不会改变,我的输出是: 但是如果我第二次按下按钮,我会得到输出: 为什么值第一次不改变?

  • 我尝试记录JPA实体的任何更改。因此,每个实体都继承自一个抽象实体类,该类具有日志条目对象列表。 AbstractEntity类: LogEntry类: 我的方法是创建一个新的LogEntry对象,并在实体更新或持久化之前将其添加到实体的LogEntry列表中。 我尝试了以下解决方案: 几乎所有这些试验都使我能够更改受影响实体的属性(如名称或validTo)。但没有任何解决方案提供创建新LogEn

  • 本文向大家介绍如何在Python中更改不可变字符串的ID?,包括了如何在Python中更改不可变字符串的ID?的使用技巧和注意事项,需要的朋友参考一下 Python中的字符串是不可变的,这意味着一旦创建了字符串,就无法更改它。创建字符串时,如果创建相同的字符串并将其分配给另一个变量,则它们都将指向相同的字符串/内存。例如, 字符串对象的这种重用在Python中称为Interning。相同的字符串具