Выполнение этого с потоками легко и доступно:
Predicate<String> notIn2 = s -> ! list2.stream().anyMatch(mc -> s.equals(mc.str)); List<String> list3 = list1.stream().filter(notIn2).collect(Collectors.toList());