【问题标题】:Passing method in other method Java在其他方法Java中传递方法
【发布时间】:2023-02-17 03:27:14
【问题描述】:

我想制作一个简单的程序来比较通过“for loop”、“foreach”或“stream”重写和打印字符串集合需要多长时间。字符串是用“y”代替“i”的句子。在我的例子中,我制作了 count() ,其中我设置为计算 stream() 方法,但我想制作通用测量方法。但我不知道该怎么做......它应该像这样工作:在主类中是`counter(forLoop);`它应该从方法类中调用`forLoop();`
`counter(forEach);` 它应该从 Metrod 类调用 `forEach();`
`counter(stream);` 它应该从 Method 类调用 `stream();`

我不知道如何将方法作为参数传递

我上课那些方法在哪里:

import java.util.*;
import java.util.stream.*;

public class Methods {

    private List<String> sentence = new ArrayList<>();
    private String oldLetter = "i";
    private String newLetter = "y";

    private String methodType;

    public String getMethodType() {
        return methodType;
    }
//making a collection with String
    public void setSizeOfCollection(int size){
        for (int i = 0; i < size; i++) {
            sentence.add("Siti Zbinek plitce zvikal sirovi pelinek.");
        }
    }

    public void forLoop(){
        methodType = "For loop";
        for (int i = 0; i < sentence.size(); i++) {
            for (int j = 0; j < sentence.size(); j++) {
                String replaceLetters = sentence.get(j);
                replaceLetters = replaceLetters.replaceAll(oldLetter, newLetter);
                sentence.set(j, replaceLetters);
            }
            System.out.println(sentence.get(i));
        }
    }

    public void forEach(){
        methodType = "For each";
        String replacedLetters = "";
        for(String oneLine: sentence){
            for(String originalLetters: sentence){
                replacedLetters = originalLetters.replaceAll(oldLetter,newLetter);
            }
            System.out.println(replacedLetters);
        }
    }
    public void stream(){
        methodType= "Stream";
        sentence.stream()
                .map(e->e.replaceAll(oldLetter,newLetter))
                .collect(Collectors.toList())
                .forEach(System.out::println);
    }
}

这是 count(),工作正常,但仅适用于方法 stream()。在评论中是我想象它应该如何。但我不知道 Java 是怎么做的:(

import org.apache.commons.lang.time.*;
public class Counter {
     private Methods methods;
     private String methodType;
     private  StopWatch stopWatch = new StopWatch();
    long timeTaken = 0;

//here should be something like any method as a parameter XXX xxx
// public void count(Methods methods XXX xxx)

    public void count(Methods methods){
     stopWatch.start();

//   here sould be something what call any function by your choice, not only stream()
 //  methods.xxx; 

     methods.stream();

     stopWatch.stop();
     timeTaken= stopWatch.getTime();
     System.out.println(methods.getMethodType()+" takes "+ timeTaken + " ms." );
 }
}

最后是主课

public class Main {
    public static void main(String[] args) {

        Methods methods = new Methods();
        Counter counter = new Counter();

        methods.setSizeOfCollection(10000);

        counter.count(methods);
//here should be finally three times method, with  different parameters:
//      counter.count(methods, forEach);
//      counter.count(methods, forLoop);
//      counter.count(methods, stream);

    }
}

有什么建议吗?

【问题讨论】:

标签: java methods parameters


【解决方案1】:

你所有的方法都有签名void()。因此,对每个方法的引用可以存储在 Runnable 实例中。

public void count(final Runnable method) {
    stopWatch.start();

    method.run();

    stopWatch.stop();
    timeTaken= stopWatch.getTime();
    System.out.println(methods.getMethodType()+" takes "+ timeTaken + " ms.");
}

然后调用为:

final Methods methods = new Methods();
final Counter counter = new Counter();

methods.setSizeOfCollection(10000);

counter.count(methods::stream);  // or count(() -> methods.stream());
counter.count(methods::forEach); // count(() -> methods.forEach());
counter.count(methods::loop);    // count(() -> methods.loop());

但是请注意,您测量方法执行时间的方法是有缺陷的;请参阅How do I write a correct micro-benchmark in Java? 获取指示

【讨论】:

    【解决方案2】:

    您可以将方法名称作为字符串传递并通过反射查找它。

    【讨论】:

    • 从 Java 8 开始,反射(不是“反射”)几乎不是正确的答案(之前它仍然是可疑的)。大多数情况下可以使用 Lambda 和方法引用。
    • 正如目前所写,您的答案尚不清楚。请edit 添加更多详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写出好的答案的信息in the help center。
    猜你喜欢
    • 2016-12-31
    • 1970-01-01
    • 2018-07-06
    • 2020-05-18
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多