Неправильный Consumer

82
22 декабря 2021, 10:50

Дано на текущий момент 3 класса и интерфейс

public interface Sendable<T> {
    String getTo();
    String getFrom();
    T getContent();
}

public class MailService<T>  implements Consumer<Sendable<T>> {

    Map<String, List<T>> mailBox;
    public Map<String, List<T>> getMailBox() {
        mailBox = new HashMap<String, List<T>>() {
            @Override
            public List<T> get(Object key) {
                return super.getOrDefault(key, new LinkedList<T>());
            }
        };
        return mailBox;
    }
    @Override
    public void accept(Sendable<T> sendable) {
        List<T> list = new ArrayList<>();
        list.add(sendable.getContent());
        mailBox.put(sendable.getTo(),list);
    }
}
public class MailMessage<T> implements Sendable{
    private String message;
    private String to;
    private String from;
    public MailMessage(String to, String from, String message) {
        this.to = to;
        this.from = from;
        this.message = message;
    }
    @Override
    public String getTo() {
        return to;
    }
    @Override
    public String getFrom() {
        return from;
    }
    @Override
    public String getContent() {
        return message;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null) {
            return false;
        }
        if (getClass() != o.getClass()) {
            return false;
        }
        if (!super.equals(0)) {
            return false;
        }
        final MailMessage<?> other = (MailMessage<?>) o;
        if (!Objects.equals(this.message, other.message)) {
            return false;
        }
        return true;
    }
    @Override
    public int hashCode() {
        int hash = 5;
        hash = 31 * hash + Objects.hash(super.hashCode(), message);
        return hash;
    }
}

public class Solution {
    public static void main(String[] args) {
        // Random variables
        String randomFrom = "..."; // Некоторая случайная строка. Можете выбрать ее самостоятельно.
        String randomTo = "...";  // Некоторая случайная строка. Можете выбрать ее самостоятельно.
        int randomSalary = 100;  // Некоторое случайное целое положительное число. Можете выбрать его самостоятельно.
// Создание списка из трех почтовых сообщений.
        MailMessage firstMessage = new MailMessage(
                "Robert Howard",
                "H.P. Lovecraft",
                "This \"The Shadow over Innsmouth\" story is real masterpiece, Howard!"
        );
        assert firstMessage.getFrom().equals("Robert Howard") : "Wrong firstMessage from address";
        assert firstMessage.getTo().equals("H.P. Lovecraft") : "Wrong firstMessage to address";
        assert firstMessage.getContent().endsWith("Howard!") : "Wrong firstMessage content ending";
        MailMessage secondMessage = new MailMessage(
                "Jonathan Nolan",
                "Christopher Nolan",
                "Брат, почему все так хвалят только тебя, когда практически все сценарии написал я. Так не честно!"
        );
        MailMessage thirdMessage = new MailMessage(
                "Stephen Hawking",
                "Christopher Nolan",
                "Я так и не понял Интерстеллар."
        );
        List<MailMessage> messages = Arrays.asList(
                firstMessage, secondMessage, thirdMessage
        );
        for (MailMessage s : messages) {
            System.out.println(s.getFrom() + " " + s.getTo() + " " + s.getContent());
        }
// Создание почтового сервиса.
        MailService<String> mailService = new MailService<>();
// Обработка списка писем почтовым сервисом
        messages.stream().forEachOrdered(mailService);
/*
// Получение и проверка словаря "почтового ящика",
//   где по получателю можно получить список сообщений, которые были ему отправлены
        Map<String, List<String>> mailBox = mailService.getMailBox();
        assert mailBox.get("H.P. Lovecraft").equals(
                Arrays.asList(
                        "This \"The Shadow over Innsmouth\" story is real masterpiece, Howard!"
                )
        ): "wrong mailService mailbox content (1)";
        assert mailBox.get("Christopher Nolan").equals(
                Arrays.asList(
                        "Брат, почему все так хвалят только тебя, когда практически все сценарии написал я. Так не честно!",
                        "Я так и не понял Интерстеллар."
                )
        ): "wrong mailService mailbox content (2)";
        assert mailBox.get(randomTo).equals(Collections.<String>emptyList()): "wrong mailService mailbox content (3)";

ВОПРОС что я делаю неправильно и почему идет ошибка в этой строке :

messages.stream().forEachOrdered(mailService);
Required type: Consumer<? super MailMessage>
Provided: MailService <String>

Я уже совсем не знаю, что сделать дабы заставить эту строку работать ....

messages.stream().forEach(mailService::accept); - работает. Но эту строку надо оставить в неизменном виде ... т.е. .forEachOrdered(mailService)

Answer 1

Попробуйте сделать так:

messages.stream().forEachOrdered(new Consumer<MailMessage>() {
    @Override
    public void accept(MailMessage mailMessage) {
        mailService.accept(mailMessage);
    }
});

И вот эту строку:

public class MailMessage<T> implements Sendable{

Следует заменить на эту:

public class MailMessage<T> implements Sendable<T> {

Answer 2

messages.stream().forEachOrdered(t -> mailService.accept(t)); - может так попробовать?

READ ALSO
Как создать несколько окон в приложении?

Как создать несколько окон в приложении?

По нажатии на кнопку хочу создать одно диалоговое окноВот код класса

183
Можно ли создать несколько датасорсов для spring-repository?

Можно ли создать несколько датасорсов для spring-repository?

Spring-приложение, использующее jpa-repository, oracle и развернутое на was85

189
Ошибка при сборке maven unable to find attribute

Ошибка при сборке maven unable to find attribute

В чем может быть ошибка? Собираю проект apk через maven

182