将System.out.println()作为方法参数传递

4

我想将 System.out.println(); 作为参数传递,但编译器不允许我将 void 类型作为参数返回。以下是我想要的效果。

public class Array {

    public static void main(String args[]) {
        a(data());
    }

    static void a(e) {
        System.out.println(e);
    }

    static void data() {
        ...
    }
}

那么经过编译后,a(data());应该是这样的。

a(data()) = System.out.println(data(){...});

最终我想简化System.out.println()的书写。
6个回答

2
你在这里做的不是将 System.out.println() 作为参数传递;你试图向 System.out.println() 传递一个参数。
尝试将 data() 的返回类型更改为 Stringint 或任何除 void 以外的类型,并从中返回该类型的值。
还需更改 a() 函数定义中的参数类型 e,使其与 data() 的返回类型匹配。
在进行这些更改后,调用 a(data()); 将实际上输出某些内容。
示例:
public static void main(String args[]) {
    a(data());
}

// shorthand for System.out.println
static void a(String e) {
    System.out.println(e);
}

// a method that returns some data
static String data() {
    // replace this with whatever actual data you want to return
    return "This is some data...";
}

1

只需将您的println语句保存到字符串中并返回以供打印
您的代码:

static void data() {
    int array[] = {1,5,6};
    int alength = array.length;
    System.out.println("  Location\tData");
    for(int i=0;i<alength;i++) {
        System.out.println("  " + i + "\t\t" + array[i]);
    }
}

改为:

更改为:

static String data() {
    int array[] = {1,5,6};
    int alength = array.length;
    //Note extra \n symbol for new line
    String result = "  Location\tData\n";
    for(int i=0;i<alength;i++) {
        result += "  " + i + "\t\t" + array[i] + "\n";
    }
    return result;
}

然后修改你的a()方法,使其接受一个字符串参数:
static void a(String result) {System.out.println(result);}

一个工作示例可能看起来像这样:

public class Array {
    public static void main(String args[]) {
        println(data());
    }

    // I strongly advise to use understandable naming
    // a() is completely uninformative
    static void println(String result) {
        System.out.println(result);
    }

    static String data() {
        int array[] = { 1, 5, 6 };
        int alength = array.length;
        // Note extra \n symbol for new line
        String result = "  Location\tData\n";
        for (int i = 0; i < alength; i++) {
            result += "  " + i + "\t\t" + array[i] + "\n";
        }
        return result;
    }
}

1

正如其他人所提到的,您不需要将System.out.println作为方法参数传递。但是,如果您想要这样做(谁也不知道...),您可以在Java 8中使用Lambda表达式来实现。

创建一个功能接口:

@FunctionalInterface 
public interface Action {
    void run(String param);
}

将此接口传递给一个方法:
public class MyClass {
    public void execute(Action action){
       action.run("Hello!");
    }
}

使用这个类:
MyClass c = new MyClass();
c.execute(System.out::println);

1
如果你只想缩写System.out.println,那么可以有一个返回类型为void的方法来接受一个字符串参数,在方法内部执行以下操作:

System.out.println(argument)


0

虽然编译器可能不允许您传递函数指针,但它应该允许您传递块。

在Objective-C中,块的语法如下:

void (^action)(NSString *s) = ^(NSString *s){ NSLog(s); }

然后,您可以将“action”块作为参数传递,并在需要时调用它:

action(@"Hello World");

块在所有最近的C语言版本中都可用,维基百科上有一篇关于该主题的好文章http://en.wikipedia.org/wiki/Blocks_(C_language_extension)


0
I want to change this code

    package Array;
import java.util.Random;

public class Array {
    public static void main(String args[]) {
        data();
        a();
        random();
        a();
        array();
        a();
        rows();
        a();
        System.out.println("average " + average(45,15,15,48,97,45));

    }

    static String s() {
        return "helloWorld";
    }

    static void a() {System.out.println();}

    static void data() {
        int array[] = {1,5,6};
        int alength = array.length;
        System.out.println("  Location\tData");
        for(int i=0;i<alength;i++) {
            System.out.println("  " + i + "\t\t" + array[i]);
        }
    }

    static void random() {
        Random rdm = new Random();
        int freq[] = new int[7];

        for(int i=1;i<1000;i++) {
            ++freq[1+rdm.nextInt(6)];
        }
        System.out.println("Face\tFrequency");
        int frequence = freq.length;
        for(int face=1;face<frequence;face++) {
            System.out.println(face+"\t"+freq[face]);
        }
    }

    static void array() {
        String po[] = {"lala","po","tinkiwinki","disty"};
        for(String lala: po) {
            System.out.print(lala + " ");
        }
        System.out.println();
    }

    static void rows() {
        int arrays[][]= {{1,5,78,15},{45,67},{875,15687,158,4515,23,2,2}};

        for(int i=0;i<arrays.length;i++) {
            for(int j=0;j<arrays[i].length;j++) {
                System.out.print(arrays[i][j]+"\t");
            }
            System.out.println();
        }
    }

    static int average(int...numbers) {
        int total=0;
        for(int x:numbers)
            total += x;
        return total/numbers.length;
    }
}
class time {
    int h, m, s;
    void setTime(int hour,int minute,int second) {
        h = ((hour>=0 && hour<=24) ? hour : 0);
        m = ((minute>=0 && minute<=60) ? minute : 0);
        s = ((second>=0 && second<=60) ? second : 0);
    }


into this type of code for main.


    a(data());
    a(random());
    a(array());
    a(rows());
a("average " + average(45,15,15,48,97,45));

这应该是对你问题的编辑,而不是一个答案。但无论如何,我不完全确定你在问什么。看起来你想让a()处理其他函数的所有打印。有两种方法可以做到这一点,两种方法都涉及更改a()以符合我在答案中描述的方式。如果你想让main()看起来与你描述的完全相同,你需要将data()random()array()rows()的返回类型更改为string,并返回一个包含你当前正在打印的内容的字符串对象。第二种方法是 - jonhopkins
将那些函数中所有对 System.out.println() 的调用替换为 a()。例如,在 data() 中,将 System.out.println(" " + i + "\t\t" + array[i]); 更改为 a(" " + i + "\t\t" + array[i]);,然后 a() 将为您打印输出。 - jonhopkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接