Chcę przekonwertować następujący kod, aby używać Lambd i strumieni i / lub innych funkcji Java 8.

Jestem nowy w Javie 8 i próbowałem przekonwertować poniższy kod na Javę 8, ale nie mogłem znaleźć żadnej funkcji, takiej jak „forEach”, która pasowałaby do mojego scenariusza.

    private String getMacAddress() {
    InetAddress ip;
    try {
        ip = InetAddress.getLocalHost();
        logger.log(LogLevel.LEVEL_INFO,"Current IP address : " + ip.getHostAddress());
        NetworkInterface network = NetworkInterface.getByInetAddress(ip);
        byte[] mac = network.getHardwareAddress();
        logger.log(LogLevel.LEVEL_INFO,"Current MAC address : ");
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < mac.length; i++) {
            sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));        
        }
        return sb.toString();
    } catch (UnknownHostException e) {
        logger.log(LogLevel.LEVEL_ERROR,e.getMessage());
    } catch (SocketException e){
        logger.log(LogLevel.LEVEL_ERROR,e.getMessage());
    }
}
0
Tiya 20 grudzień 2019, 01:30

2 odpowiedzi

Jeśli chcesz używać strumienia w javie, musisz go najpierw wywołać. Kolekcje mają funkcję .stream(), dla tablic możesz użyć biblioteki Arrays przez Arrays.stream(mac).

Pozwala to na użycie typowych funkcji strumieniowych, takich jak forEach, map lub filter.

W twoim konkretnym przypadku wybrałbym mapę (odwzorowuję bajty na sformatowane ciągi), a następnie konkluduję je:

Arrays
 .stream(mac)
 .map(e -> String.format("%02X", e))
 .collect(Collectors.joining("-");

Zwróć uwagę, że strumienie java muszą być zbierane przez tzw. Collectora, jeśli chcesz pobrać dane.

Edycja: zauważ również, że Arrays.stream przyjmuje argument typu T[], więc tablice z typem prymitywnym nie będą działać ...

1
Dániel Somogyi 20 grudzień 2019, 16:19

Przekonwertuj tablicę bajtów na strumień liczb całkowitych. Od tego momentu możesz używać funkcji strumienia, aby odwzorować je na odpowiedni format i dołączyć do nich.

 ByteArrayInputStream inputStream = new ByteArrayInputStream(mac);
 IntStream intStream = IntStream.generate(inputStream::read)
                                .limit(inputStream.available());
 String result = intStream .mapToObj(b -> { return String.format("%02X",(byte)b);} )
                           .collect(Collectors.joining("-"));
1
FredvN 20 grudzień 2019, 02:51