JAVA引用不带参数的方法

JAVA引用不带参数的方法,java,java-8,Java,Java 8,我在理解Java8时遇到了一个问题,即将方法引用为静态方法的参数。在我的代码中,我找不到如何发送对一个方法的引用,该方法没有任何参数,并且必须是一个确定类对象的方法 因此,我希望我发送给静态函数的方法可以用于静态方法中的对象 import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.stream.St

我在理解Java8时遇到了一个问题,即将方法引用为静态方法的参数。在我的代码中,我找不到如何发送对一个方法的引用,该方法没有任何参数,并且必须是一个确定类对象的方法

因此,我希望我发送给静态函数的方法可以用于静态方法中的对象

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

interface FuncForPath<T> {
    T func(T path);
}

class MethodsForFolder {

    public static void printFilesInFolder(Path path, FuncForPath<Path> funcPath) {
        Stream<Path> paths = null;
        try {
            paths = Files.list(path);
        } catch (IOException e) {
            System.out.println(
                    "The problems have been appeared during reading folder: " + path.toAbsolutePath().toString());
            e.printStackTrace();
        }
        System.out.println("Files list in folder:" + path.toAbsolutePath().toString());
        paths.forEach(p -> funcPath.func(p).toString()); // I don't know to how to write this code to perform
    }
}

public class TestRefToIntance {

    public static String testWindowsFloder = "C://Logs";

    public static void main(String[] args) {

        Path path = Paths.get(testWindowsFloder);
        // I want that this 2 methods are performed depending on transfered methods
        // reference
        MethodsForFolder.printFilesInFolder(path, Path::toAbsolutePath);
        MethodsForFolder.printFilesInFolder(path, Path::getFileName);
    }
}
import java.io.IOException;
导入java.nio.file.Files;
导入java.nio.file.Path;
导入java.nio.file.path;
导入java.util.stream.stream;
接口路径{
T函数(T路径);
}
类方法文件夹{
公共静态void打印文件信息文件夹(路径路径,FuncForPath funcPath){
流路径=空;
试一试{
路径=文件。列表(路径);
}捕获(IOE异常){
System.out.println(
读取文件夹时出现问题:“+path.toabsolutionPath().toString());
e、 printStackTrace();
}
System.out.println(“文件夹中的文件列表:”+path.toabsolutionPath().toString());
paths.forEach(p->funcPath.func(p).toString());//我不知道如何编写此代码来执行
}
}
公共类TestRefToIntance{
公共静态字符串testWindowsFloder=“C://Logs”;
公共静态void main(字符串[]args){
Path Path=Path.get(testWindowsFloder);
//我希望这两种方法的执行取决于传输的方法
//参考文献
printFilesInFolder(路径,路径::ToAbsolutionPath);
PrintFileInfolder(路径,路径::getFileName);
}
}
尝试
函数
而不是
函数路径
。这将需要一个方法,该方法采用
Path
参数并返回
Path
。请注意,实例方法总是有一个“不可见”的
参数,因此
Path::getFileName
与该签名匹配


然后您可以这样调用它:
path.forEach(p->funcPath.apply(p.toString())(虽然您没有对返回的字符串执行任何操作,所以您可能希望调用
Path.map(f).map(Path::toString).collect(someCollector);

我如何理解我已解决了此问题。下面是代码

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

interface FuncForPath<T> {
    T func(T path);
}

class MethodsForFolder {

    public static void printFilesInFolder(Path path, FuncForPath<Path> funcPath) {
        Stream<Path> paths = null;
        try {
            paths = Files.list(path);
        } catch (IOException e) {
            System.out.println(
                    "The problems have been appeared during reading folder: " + path.toAbsolutePath().toString());
            e.printStackTrace();
        }
        System.out.println("Files list in folder:" + path.toAbsolutePath().toString());
        paths.forEach(p -> System.out.println(funcPath.func(p).toString())); // I don't know to how to write this code to perform
    }
}

public class TestRefToIntance {

    public static String testWindowsFloder = "C://Logs";

    public static void main(String[] args) {

        Path path = Paths.get(testWindowsFloder);
        // I want that this 2 methods are performed depending on transfered methods
        // reference
        MethodsForFolder.printFilesInFolder(path, Path::toAbsolutePath);
        MethodsForFolder.printFilesInFolder(path, Path::getFileName);
    }
}
import java.io.IOException;
导入java.nio.file.Files;
导入java.nio.file.Path;
导入java.nio.file.path;
导入java.util.stream.stream;
接口路径{
T函数(T路径);
}
类方法文件夹{
公共静态void打印文件信息文件夹(路径路径,FuncForPath funcPath){
流路径=空;
试一试{
路径=文件。列表(路径);
}捕获(IOE异常){
System.out.println(
读取文件夹时出现问题:“+path.toabsolutionPath().toString());
e、 printStackTrace();
}
System.out.println(“文件夹中的文件列表:”+path.toabsolutionPath().toString());
paths.forEach(p->System.out.println(funcPath.func(p.toString());//我不知道如何编写此代码来执行
}
}
公共类TestRefToIntance{
公共静态字符串testWindowsFloder=“C://Logs”;
公共静态void main(字符串[]args){
Path Path=Path.get(testWindowsFloder);
//我希望这两种方法的执行取决于传输的方法
//参考文献
printFilesInFolder(路径,路径::ToAbsolutionPath);
PrintFileInfolder(路径,路径::getFileName);
}
}

此外,我还删除了接口描述中的通用规范

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

interface FuncForPath { // there is interface without type <T>
    Path func(Path path);
}

class MethodsForFolder {

    public static void printFilesInFolder(Path path, FuncForPath funcPath) {
        Stream<Path> paths = null;
        try {
            paths = Files.list(path);
        } catch (IOException e) {
            System.out.println(
                    "The problems have been appeared during reading folder: " + path.toAbsolutePath().toString());
            e.printStackTrace();
        }
        System.out.println("Files list in folder:" + path.toAbsolutePath().toString());
        paths.forEach(p -> System.out.println(funcPath.func(p).toString())); // I don't know to how to write this code
                                                                                // to perform
    }
}

public class TestRefToIntance {

    public static String testWindowsFloder = "C://Logs";

    public static void main(String[] args) {

        Path path = Paths.get(testWindowsFloder);
        // I want that this 2 methods are performed depending on transfered methods
        // reference
        MethodsForFolder.printFilesInFolder(path, Path::toAbsolutePath);
        MethodsForFolder.printFilesInFolder(path, Path::getFileName);
    }
}
import java.io.IOException;
导入java.nio.file.Files;
导入java.nio.file.Path;
导入java.nio.file.path;
导入java.util.stream.stream;
接口FuncForPath{//存在没有类型的接口
路径函数(路径);
}
类方法文件夹{
公共静态void打印文件信息文件夹(路径路径,FuncForPath funcPath){
流路径=空;
试一试{
路径=文件。列表(路径);
}捕获(IOE异常){
System.out.println(
读取文件夹时出现问题:“+path.toabsolutionPath().toString());
e、 printStackTrace();
}
System.out.println(“文件夹中的文件列表:”+path.toabsolutionPath().toString());
paths.forEach(p->System.out.println(funcPath.func(p.toString());//我不知道如何编写这段代码
//表演
}
}
公共类TestRefToIntance{
公共静态字符串testWindowsFloder=“C://Logs”;
公共静态void main(字符串[]args){
Path Path=Path.get(testWindowsFloder);
//我希望这两种方法的执行取决于传输的方法
//参考文献
printFilesInFolder(路径,路径::ToAbsolutionPath);
PrintFileInfolder(路径,路径::getFileName);
}
}

您的问题是什么?代码不工作吗?它会给您带来什么错误?它工作吗,但会产生意外的结果?请指定。很抱歉,我以前使用另一个类的静态方法发布了代码。我已经编辑了代码,它现在可以像以前的版本一样工作。我看到一条消息“文件夹中的文件列表:C:\Logs”..您可以执行
Path.map(funcPath).map(Path::toString)
这样它就可以从您的路径转换到函数返回的路径,然后转换到字符串表示形式。另外请注意,您可能需要通过
.forEach(System.out::println)
或其他方式打印它们。@daniu是的,刚刚添加了用法部分:)很快,这是我的错。我想在控制台中打印文件列表。另一种可能是
.map(f.andThen(Path::toString)).collect(…)
您可以这样做,但通常不需要
函数