package com.tutego.ch_03.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.util.Optionals;
import org.springframework.data.util.StreamUtils;
import org.springframework.data.util.Streamable;
import org.springframework.util.Assert;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;
import java.nio.file.FileSystems;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
@SpringBootApplication(scanBasePackageClasses = UtilsModule.class)
public class UtilsApplication {
private static final Logger logger = LoggerFactory.getLogger(UtilsApplication.class);
public static void main(String... args) {
SpringApplication.run(UtilsApplication.class, args);
// public interface MultiValueMap<K, V> extends Map<K, List<V>>
// org.springframework.util.MultiValueMap
MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>();
multiValueMap.addAll("a", List.of("b", "c"));
// org.springframework.util.Assert
Assert.noNullElements(multiValueMap.get("a"), () -> "null values");
// org.springframework.util.StringUtils
var res = StringUtils.collectionToCommaDelimitedString(multiValueMap.get("a"));
logger.info("content for entry 'a': {}", multiValueMap.get("a"));
logger.info("commaDelimitedString: {}", res);
// org.springframework.data.util.Optionals
var tuple = Optionals.withBoth(Optional.of(40), Optional.of(2));
var meaningOfLife = tuple.map(pair -> pair.getFirst() + pair.getSecond()).orElse(0);
// org.springframework.data.util.Streamable
var set = Streamable.of(FileSystems.getDefault().getRootDirectories())
.map(String::valueOf)
.and("cloud")
.and("local")
.toSet();
logger.info("directories: {}", set);
// org.springframework.data.util.StreamUtils
var zippedStream = StreamUtils.zip(Stream.of(1, 2, 3), Stream.of("a", "b", "c"), (num, s) -> s.repeat(num)).toList();
logger.info("zippedStream: {}", zippedStream);
}
}