gpt4 book ai didi

java - 在 gs-uploading-files Spring Boot 示例上将 Java 1.8 lambda 转换为 Java 1.7

转载 作者:搜寻专家 更新时间:2023-11-01 04:02:37 24 4
gpt4 key购买 nike

我正在 https://spring.io/ 上进行一些练习 Spring Boot 。

做例子https://spring.io/guides/gs/uploading-files/当我使用 Java 8 时它工作正常,但不幸的是,我在 Web 服务中包装的代码需要 Java 7。我列出了所有错误代码,有人可以帮助我将 lambda 转换为 1.7 兼容代码并替换新库(java.util.stream.Stream 和 java.util.stream.Collectors)。

应用程序.java

@SpringBootApplication
@EnableConfigurationProperties(StorageProperties.class)
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

@Bean
CommandLineRunner init(StorageService storageService) {
return (args) -> {
storageService.deleteAll();
storageService.init();
};
}
}

return (args) -> errors out saying "use source -8 or higher to enable lambda expressions"

FileUploadController.java

import java.util.stream.Collectors

//..

@GetMapping("/")
public String listUploadedFiles(Model model) throws IOException {

model.addAttribute("files", storageService
.loadAll()
.map(path ->
MvcUriComponentsBuilder
.fromMethodName(FileUploadController.class, "serveFile", path.getFileName().toString())
.build().toString())
.collect(Collectors.toList()));

return "uploadForm";
}

package java.util.stream does not exist

type loadAll() is erroneous

errors out saying "use source -8 or higher to enable lambda expressions"

FileSystemStorageService.java

@Override
public Stream<Path> loadAll() {
try {
return Files.walk(this.rootLocation, 1)
.filter(path -> !path.equals(this.rootLocation))
.map(path -> this.rootLocation.relativize(path));
} catch (IOException e) {
throw new StorageException("Failed to read stored files", e);
}

}

cannot find symbol walk

errors out saying "use source -8 or higher to enable lambda expressions"

StorageService.java

import java.util.stream.Stream;

public interface StorageService {

void init();

void store(MultipartFile file);

Stream<Path> loadAll();

Path load(String filename);

Resource loadAsResource(String filename);

void deleteAll();

}

package java.util.stream does not exist

最佳答案

Bulltorious,我很抱歉你的赏金,但你真的只有很少的选择。 Stream API 仅在 Java 8 中添加,因此在 Java 7 中不存在。您可以通过手动或几乎自动编写匿名类来解决与 lambda 相关的问题(参见 Retrolambda )。然而,对于 Stream API,您只有两个选择:

  1. 手动将 Stream API 反向移植到 Java 7。或者使用其他人尝试向后移植,例如 streamsupport project在 SourceForge 上(或在 GitHub 上复制)
  2. 摆脱 Stream API 并使用旧的 Java 7 类。

更新(替换Files.walk)

如果您的 Files.walk 是您唯一使用 Java-8 特定 API 的地方,您可以相对轻松地将其替换为 Java 7 API:

interface PathNameMapper
{
String mapPath(Path path);
}


List<String> loadAll(PathNameMapper mapper)
{
try
{
List<String> result = new ArrayList<>();

Files.walkFileTree(rootLocation, EnumSet.noneOf(FileVisitOption.class), 1, new SimpleFileVisitor<Path>()
{
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException
{
if (!rootLocation.equals(file))
{
result.add(mapper.mapPath(rootLocation.relativize(file)));
}
return FileVisitResult.CONTINUE;
}
});


return result;
}
catch (IOException e)
{
throw new StorageException("Failed to read stored files", e);
}
}

然后你的 listUploadedFiles 会变成这样

@GetMapping ("/")
public String listUploadedFiles(Model model) throws IOException
{

model.addAttribute("files", storageService
.loadAll(new PathNameMapper()
{
@Override
public String mapPath(Path path)
{
return MvcUriComponentsBuilder
.fromMethodName(FileUploadController.class, "serveFile", path.getFileName().toString())
.build().toString();
}
}));

return "uploadForm";
}

更新 2(labmda -> 匿名类转换)

为了完整起见,还有一个如何手动将 lambda 转换为匿名类的示例:

@Bean
CommandLineRunner init(StorageService storageService)
{
return new CommandLineRunner()
{
@Override
public void run(String... args) throws Exception
{
storageService.deleteAll();
storageService.init();
}
};
}

关于java - 在 gs-uploading-files Spring Boot 示例上将 Java 1.8 lambda 转换为 Java 1.7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43127703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com